Jessie-Cheng1 / xuexi

0 stars 0 forks source link

二叉树遍历 #129

Open Jessie-Cheng1 opened 2 years ago

Jessie-Cheng1 commented 2 years ago

二叉树的结构定义:

struct Treenode{
  int val;
  Treenode* left;
  Treenode* right;
  Treenode(int x,Treenode* left,Treenode* right){val(x), left(left), right(right) 
};

深度

  1. 递归
  1. 迭代 用栈来实现,栈是先进后出的结构
    • 前 根先压入,然后弹出根 接下来栈压入右子树、左子树,所以出来就是左、右 所以就是根左右
      class Solution {
      public:
      vector<int> preorderTraversal(TreeNode* root) {
      stack<TreeNode*> st;
      vector<int> res;
      if(root) st.push(root);
      while(!st.empty()){
          TreeNode* node=st.top();
          st.pop();
          res.push_back(node->val);
          if(node->right) st.push(node->right);//注意顺序,栈是先进后出
          if(node->left) st.push(node->left);//这里要加if判断,递归不用,因为递归进去之后会有判断是不是为空
      }
      return res;
      }
      }; 
    • 中 和前后有点不一样,因为它的处理顺序和访问顺序是不一致的。 所以需要用指针的遍历指向访问的结点,栈用来处理结点上的元素。
      class Solution {
      public:
      vector<int> inorderTraversal(TreeNode* root) {
      stack<TreeNode*> st;
      vector<int> res;
      TreeNode* cur=root;
      while(cur!=nullptr || !st.empty()){
          if(cur!=nullptr){
              st.push(cur);
              cur=cur->left;
          }
          else{
              cur=st.top();
              st.pop();
              res.push_back(cur->val);
              cur=cur->right;
          }
      }
      return res;
      }
      };

广度(层次)