haipengwu

二叉树

一、二叉树理论基础

1.满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。通俗话理解:从底层开始到顶部的所有节点都全部填满的二叉树。深度为k,则有2^k-1个节点

2.完全二叉树:除了最底层节点没有节满,其余每层节点都达到最大值,并且最底层节点全都从最左边开始,按照顺序节若干个节点,中间不能出现空缺部分。

3.搜索二叉树:是一个有序树,遵循左节点小于根节点、右节点大于根节点的原则依次从上到下排列展开。

4.平衡搜索二叉树:是指满足左子树与右子树的高度差不超过1要求的搜索二叉树。

二、二叉树的定义与遍历

1.遍历方法:前序(根左右)、中序(左根右)、后序(左右根);

2.二叉树可用链表和数组定义,链表定义符合深度搜索法,数组定义按照层级搜索(根节点位置为i,则其左右节点位置分别为2i+1,2i+2)。

3.二叉树链表定义:

 struct treeNode{
  int val;//数值
  treeNode* left;//左指针
  treeNode* right;//右指针
  treeNode(int x): val(x),left(NULL),right(NULL) {} // 构造函数

 

三、二叉树递归遍历

递归三步曲:

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

 void traversal(TreeNode* cur, vector<int>& vec) //vec用于存放节点数值

2.确定终止条件:当遍历节点为空时,就return

 if (cur == NULL) return;

3.单层递归逻辑

 //前序遍历
 vec.push_back(cur->val);   // 中
 traversal(cur->left, vec); // 左
 traversal(cur->right, vec); // 右

前序遍历完整代码

 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;
    }
 };//后序和中序遍历只需要把交换三个节点位置即可完成

四、二叉树迭代法遍历(栈结构)

 //前序遍历:中左右
 class Solution {
 public:
     vector<int> preorderTraversal(TreeNode* root) {
         stack<TreeNode*> st;
         vector<int> result;
         if (root == NULL) return result;
         st.push(root);
         while (!st.empty()) {
             TreeNode* node = st.top();                       // 中
             st.pop();
             result.push_back(node->val);
             if (node->right) st.push(node->right);           // 右 栈先进后出
             if (node->left) st.push(node->left);             // 左
        }
         return result;
    }
 };
 
 //后序遍历:左右中 === 中左右->中右左->左右中
 class Solution {
 public:
     vector<int> postorderTraversal(TreeNode* root) {
         stack<TreeNode*> st;
         vector<int> result;
         if (root == NULL) return result;
         st.push(root);
         while (!st.empty()) {
             TreeNode* node = st.top();            //中
             st.pop();
             result.push_back(node->val);
             if (node->left) st.push(node->left); // 左
             if (node->right) st.push(node->right); // 右
        }
         reverse(result.begin(), result.end()); // 将结果反转之后就是左右中的顺序了
         return result;
    }
 };
 
 //中序遍历
 class Solution {
 public:
     vector<int> inorderTraversal(TreeNode* root) {
         vector<int> result;
         stack<TreeNode*> st;
         TreeNode* cur = root;
         while (cur != NULL || !st.empty()) {
             if (cur != NULL) {
                 st.push(cur);
                 cur = cur

分类:

技术点:

相关文章: