Leetcode刷题记录---94. Binary Tree Inorder Traversal

做这一道题主要是为了回顾一下二叉树的中序遍历,其主要思路如下:

  • 因为中序遍历需要先对左子树进行递归,因此在使用非递归方式的时候,也必须先处理左边的子树,因此对于一个节点,如果它存在左儿子,应当先把左儿子入栈。
  • 当找到一个节点,这个节点不含有左儿子时,这意味着相对于这个节点而言,它已经没有需要处理的左子树了,就可以将其出栈,并将其打印出来。
  • 这时候我们转而考虑该节点的右儿子,如果存在右儿子,入栈。
  • 但是此时不能够将右儿子弹出打印,我们需要考虑以右儿子为根节点的情况,即它有没有左儿子,因此我们又回到了步骤一。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        TreeNode* p = root;
        TreeNode* temp;
        stack<TreeNode*> stack;
        vector<int> resultVec;

        while(p || !stack.empty()){

            while(p){
                stack.push(p);
                p = p->left;
            }
            
            if(!stack.empty()){
                p = stack.top();
                stack.pop();
        
                resultVec.push_back(p->val);
                p = p->right;
                
            }
            
                

                
        }
        return resultVec;
    }
};
posted @ 2020-03-31 17:17  c_y_yuan  阅读(69)  评论(0编辑  收藏  举报