二叉树的中序遍历

189 阅读2分钟

考察内容:二叉树,中序遍历,递归

时间:2020-09-05 星期五

作者:guuzaa

掘金主页:🌏

题目描述 📃

题目链接 🔗,题目来自 lintcode 67题,二叉树的中序遍历。

中序遍历是遍历二叉树的一种方式。

首先中序遍历左子树,然后访问根节点,最后中序遍历右子树。因为根在中间遍历,故称为 中序遍历

分析 💻

递归解法

递归解法特别好写,因为中序遍历就是通过递归定义的。递归体就是先中序遍历左子树,然后访问根节点,最后中序遍历右子树;递归出口也很容易想到,当根节点为空的时候,返回上层调用。

C++ 代码

vector<int> inorderTraversal(TreeNode *root) {
    vector<int> res;
    if (root == nullptr) return res;
    // 遍历左子树
    auto left = inorderTraversal(root->left);
    res.insert(res.end(), left.begin(), left.end());
    // 访问根节点
    res.push_back(root->val);
    // 遍历右子树
    auto right = inorderTraversal(root-right);
    res.insert(res.end(),right.begin(), right.end());
    
    return res;
}

迭代解法

那么中序遍历怎么用迭代实现呢?

首先我们用栈模拟函数调用栈,不停遍历树的左子树根节点并把它放入栈中。当左子树为空时,访问根节点。如果右子树非空,那么遍历右子树。按照上面的步骤不停迭代,直到栈空或者工作指针为空。root 充当工作指针的角色,代码实现如下:

C++ 解法
 vector<int> inorderTraversal(TreeNode * root) {
     vector<int> res;
     stack<TreeNode*> tool;

     while(root || !tool.empty()) {

         while(root) {
             tool.push(root);
             root = root->left;
         }

         auto item = tool.top();
         tool.pop(); // 实名吐槽 C++好麻烦 pop就弹出栈顶元素,返回void 
         res.push_back(item->val);

         if (item->right) root = item->right;
     }

     return res;
 }
Python 代码
 def inorderTraversal(self, root):
        res, stack = [], []
        
        while root or stack:
            while root:
                stack.append(root)
                root = root.left
            
            top = stack.pop()
            res.append(top.val)
            
            if top.right:
                root = top.right
                
        return res

总结 📕:

  • 非递归实现我想了好久,才想出怎样写。
  • C++ 弹出栈顶元素太麻烦!!
  • 时空复杂度还不太会分析

全文完