leetcode第一刷_Binary Tree Inorder Traversal

递归实现当然太简单,也用不着为了ac走这样的捷径吧。。非递归实现还挺有意思的。

树的非递归遍历一定要借助栈,相当于把原来编译器做的事情显式的写出来。对于中序遍历,先要訪问最左下的节点,一定是进入循环后,不断的往左下走,走到不能走为止,这时候,能够从栈中弹出訪问的节点,相当于“左根右”过程的“根”,然后应该怎么做呢?想一下中序遍历完根节点之后应该干嘛,对,是走到右子树中继续反复这个过程,可是有一点,假设这个节点不包括右子树怎么办?这样的情况下,下一个应该訪问的节点应该是他的父亲,他的父亲如今应该就在栈顶,可是不要忘记每次进入循环的时候都是一直往左子树跑,所以要把当前节点置空,这样跳过走左子树的循环直接操作栈。

是不是比仅仅写递归的收获多一些?

class Solution {
public:
    vector<int> inorderTraversal(TreeNode *root) {
        vector<int> res;
        if(root == NULL) return res;
        stack<TreeNode *> sta;
        TreeNode *pNode = root;
        sta.push(root);
        while(!sta.empty()){
            while(pNode&&pNode->left){
                sta.push(pNode->left);
                pNode = pNode->left;
            }
            pNode = sta.top();
            sta.pop();
            res.push_back(pNode->val);
            if(pNode->right){
                sta.push(pNode->right);
                pNode = pNode->right;
            }else
                pNode = NULL;
        }
        return res;
    }
};

leetcode第一刷_Binary Tree Inorder Traversal,布布扣,bubuko.com

时间: 2024-10-15 07:50:20

leetcode第一刷_Binary Tree Inorder Traversal的相关文章

leetcode第一刷_Binary Tree Level Order Traversal II

很简单的题目,在想是不是后面就不要更这么简答的了,大家都会写,没人看啊.层序遍历的基础上,加了保存每一层,加了从下往上输出,就是一个vector和一个stack的问题嘛,无他,但手熟尔. class Solution { public: vector<vector<int> > levelOrderBottom(TreeNode *root) { vector<vector<int> > res; if(root == NULL) return res; q

leetcode第一刷_Binary Tree Maximum Path Sum

这是道好题. 题目指明了路径的起点和重点是任意的,可以是一个节点可以是包含父节点和左右子树的路径.问题的关键是,这个左右子树返回的不能是整个树的最大和,而只能是包含了这个子树根节点的一条左路径或者右路径.也不知道这么说是否明白,画图说明是在太麻烦了.. 这么说吧,题目虽然对路径的条件没有限制,但是路径还是要求的,如果直接返回左右子树的结果,那么这个结果可能是来自于一个叶子节点,也可能是整个子树,什么都有可能,当这个结果实际上是由不包含子树的根节点计算出来的,那么接到上一层的时候,用了这个结果,而

[leetcode]_Binary Tree Inorder Traversal

题目:二叉树的中序遍历. 思路:用递归来写中序遍历非常简单.但是题目直接挑衅说,----->"Recursive solution is trivial".好吧.谁怕谁小狗. 递归代码: 1 List<Integer> inOrder = new ArrayList<Integer>(); 2 3 public List<Integer> inorderTraversal(TreeNode root) { 4 inOrderT(root); 5

leetcode 题解:Binary Tree Inorder Traversal (二叉树的中序遍历)

题目: Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tree {1,#,2,3}, 1 2 / 3 return [1,3,2]. Note: Recursive solution is trivial, could you do it iteratively? 说明:1)下面有两种实现:递归(Recursive )与非递归(迭代iterative

leetcode第一刷_Symmetric Tree

必须承认,一开始这道题我是不会做的,因为我心目中的树遍历只能用一个节点发起,多么天真而无知. 我想不通怎样同时遍历两颗子树,因为根节点一定是一个啊.可是,作为对称轴上的它,从一开始就不应该被考虑,他的左右孩子,不是很自然的形成了两个遍历的入口吗?可见无知是多么的可怕. bool helper(TreeNode *left, TreeNode *right){ if(left == NULL && right == NULL) return true; if(left == NULL ||

LeetCode 94:Binary Tree Inorder Traversal(中序遍历)

Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 \ 2 / 3 return [1,3,2]. 题目要求对二叉树进行非递归的中序遍历,所谓前序遍历即,先访问左子树.再访问根节点.然后是右子树.通常采用递归的方法,题目要求采用非递归的方法实现.算法如下: 1)如果根节点非空,将根节点加入到栈中. 2)如果栈不空,取栈

LeetCode OJ:Binary Tree Inorder Traversal(中序遍历二叉树)

Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tree {1,#,2,3}, 1 2 / 3 return [1,3,2]. Note: Recursive solution is trivial, could you do it iteratively?中序遍历二叉树,递归遍历当然很容易,题目还要求不用递归,下面给出两种方法: 递归: 1 /**

LeetCode OJ 94. Binary Tree Inorder Traversal

Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tree [1,null,2,3], 1 2 / 3 return [1,3,2]. Note: Recursive solution is trivial, could you do it iteratively? Subscribe to see which companies asked this

leetcode || 94、Binary Tree Inorder Traversal

problem: Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [1,3,2]. Note: Recursive solution is trivial, could you do it iteratively? confused what "{1,#,2,3}" means?