BinaryTree_3_迭代遍历

  1. 迭代遍历关键在于记忆
  2. 144.二叉树的前序遍历
  3. 94.二叉树的中序遍历
  4. 145.二叉树的后序遍历

迭代遍历关键在于记忆

1.采用迭代, 也就是非递归的形式进行前序/中序/后序遍历
2.对于前序和中序, 都是采用的是迭代的形式进行遍历, 因为树节点没有返回的指针, 所以不能回去访问, 也就是不能直接游走遍历, 所以需要用栈记下来 [上一次访问的根节点是哪个], 然后从栈里面取出来, 这样就能继续迭代遍历了

144.二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:输入:root = [1,null,2,3] 输出:[1,2,3]

示例 2:输入:root = [] 输出:[]

示例 3:输入:root = [1] 输出:[1]

示例 4:输入:root = [1,2] 输出:[1,2]

示例 5:输入:root = [1,null,2] 输出:[1,2]

class Solution {
 public:
  vector<int> preorderTraversal(TreeNode* root) {
    vector<int> ans;
    if (root == nullptr) {
      return ans; 
    }
    stack<TreeNode*> preNode;
    while (root != nullptr || !preNode.empty()) {
      // 持续下钻走到最左下角的叶子节点
      while (root != nullptr) {
        ans.push_back(root->val);
        preNode.push(root);
        root = root->left;
      }
      // 回退到上一个根节点, 我们已经通过栈顶元素保存了上一个根节点
      root = preNode.top();
      preNode.pop();
      // 然后再去访问这个根节点的右边孩子节点
      root = root->right;
    }
    return ans;
  }
};

94.二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:输入:root = [1,null,2,3] 输出:[1,3,2]

示例 2:输入:root = [] 输出:[]

示例 3:输入:root = [1] 输出:[1]

class Solution {
 public:
  vector<int> inorderTraversal(TreeNode* root) {
    vector<int> ans;
    if (root == nullptr) {
      return ans;
    }
    stack<TreeNode*> preNode;
    while (root != nullptr || !preNode.empty()) {
      // 持续下钻走到最左下角的叶子节点
      while (root != nullptr) {
        preNode.push(root);
        root = root->left;
      }
      // 回退到上一个根节点, 我们已经通过栈顶元素保存了上一个根节点
      root = preNode.top();
      preNode.pop();
      ans.push_back(root->val);
      // 然后再去访问这个根节点的右边孩子节点
      root = root->right;
    }
    return ans;
  }
};

二叉树的后序遍历和 [前序/中序] 有所不同,
1.迭代地按照先 [根] 然后 [左右孩子] 进行遍历得到一个根左右的结果, 然后我们将结果直接翻转, 得到 [左右孩子] 和 [根] 的结果

145.二叉树的后序遍历

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。

示例 1:输入:root = [1,null,2,3] 输出:[3,2,1]

示例 2:输入:root = [] 输出:[]

示例 3:输入:root = [1] 输出:[1]

class Solution {
 public:
  vector<int> postorderTraversal(TreeNode* root) {
    vector<int> ans;
    if (root == nullptr) {
      return ans;
    }
    stack<TreeNode*> preNode;
    preNode.push(root);
    while (!preNode.empty()) {
      root = preNode.top();
      preNode.pop();
      ans.push_back(root->val);
      if (root->left != nullptr) {
        preNode.push(root->left);
      }
      if (root->right!= nullptr) {
        preNode.push(root->right);
      }
    }
    // 反转遍历的结果: [根][左右] => [左右][根]
    reverse(ans.begin(), ans.end());
    return ans;
  }
};

转载请注明来源, from goldandrabbit.github.io

💰

×

Help us with donation