代码随想录|二叉树 栈与队列基础知识

目录

一:二叉树基础知识

        1.分类(4类)(无数字2)(有数字2)

        2. 存储方式

        3.遍历方式                

        4.定义(链表==二叉树)

二:栈(stack)与队列基础知识(还不是很详细,很懂)

三:二叉树递归遍历


一:二叉树基础知识

        1.分类(4类)(无数字2)(有数字2)

        满二叉树  2^k-1

        完全二叉树(堆):除了底层的节点未填满,其余层节点都达到最大值,并在最下面层的节点都集中在最左边     设最底层为h层,则该层包含1-2^(h-1)个节点

        二叉搜索树(有序树)(有数值):左右子树称为二叉排序树     下面都是二叉搜索树

        左子树的节点值小于中间节点,右子树的节点值大于中间节点(时间复杂度logn)

、 

        平衡二叉搜索树 :它是一棵空树或它的左右两个子树的高度差的绝对值不超过<=1,并且左右两个子树都是一棵平衡二叉树。

    

         2. 存储方式

                链式存储(指针链表)(常用)  :把各个地址的节点串联起来   ---节点元素 左指针 右指针

                顺序存储(数组):元素顺序存储且空间连续分布

                                                父节点数组下标为i,左孩子是i*2+1 右孩子是i*2+2

        3.遍历方式                

  • 深度优先遍历:先往深走,遇到叶子节点再往回走。(栈)
    • 前序遍历(递归法,迭代法)(中左右)(从上到下)
    • 中序遍历(递归法,迭代法)(左中右)(从左到右)
    • 后序遍历(递归法,迭代法)(左右中)(从下到上)  前中后是表示中在哪个位置

  • 广度优先遍历:一层一层的去遍历。(队列)
    • 层次遍历(迭代法)

        4.定义(链表==二叉树)

struct TreeNode{
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x):val(x),left(NULL),right(NULL){}
};//要学会定义二叉树(手写)

二叉树是一个基础的数据结构,众多数据结构的基石

二:栈(stack)与队列基础知识(还不是很详细,很懂)

                栈和队列是STL(C++标准库)里面的数据结构   

                栈  先进后出               队列    先进先出 

                栈:在SGI STL,如果没有指定底层实现,默认deque为缺省情况下栈的底层结构,deque是一个双向队列,只要封住一段,开通另一端就实现了栈的逻辑。

std::stack<int,std::vector<int>> third;
//用vector为底层容器的栈


std::queue<int,std::list<int> third;
//用list为底层容器的队列

(ps:由于二叉树的内容涉及到栈所以这里先做出基础知识的补充,后期决定先学栈与队列-> 二叉树->回溯)

三:二叉树递归遍历

                1.确定递归函数的参数和返回值

void traversal(TreeNode* cur,vector<int>& vec)

                2.确定终止条件

if(cur==NULL) return ;

                3.确定单层循环的逻辑

//前序列
vec.push_back(cur->val);//中
traversal(cur->left,vec);//左
traveral(cur->right,vec);//右
//中序列
traveral(cur->left,vec);//左
vec.push_back(cur->val);//中
traveral(cur->right,vec);//右
//后排序
traveral(cur->left,vec)//左
traveral(cur->right,vec);//右
vec.push_back(cur->val);//中

整体代码(前排序)

class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& vec) {
        if (cur == NULL) return;
        vec.push_back(cur->val);    // 中
        traversal(cur->left, vec);  // 左
        traversal(cur->right, vec); // 右
    }
//下面这么设置,是固定写法
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root, result);
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/Brittney27/article/details/128884251
今日推荐