閱讀654 返回首頁    go 阿裏雲 go 技術社區[雲棲]


LeetCode題目詳解——Binary Tree Inorder Traversal

題目:

Given a binary tree, return the preorder 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?

中序遍曆和先序遍曆有很多相似的地方,隻是在訪問的順序上有一點不太一樣。非遞歸的遍曆同樣分為使用棧和不使用棧的方式。

一、使用棧

class Solution {
public:
    vector<int> inorderTraversal(TreeNode *root) {
        stack<TreeNode*> rest;
        vector<int> result;
        rest.push(root);
        TreeNode *cur;

        if(root == NULL)
            return result;
        cur=root;
        while(!rest.empty() || cur)
        {
            while (cur) {
                rest.push(cur);
                cur = cur->left;
            }
            if(!rest.empty())
            {
                cur = rest.top();
                result.push_back(cur->val);
                rest.pop();
                cur=cur->right;
            }
        }
        return result;
    }
};


、不使用棧

不使用棧的方法即morris方法,利用改變樹的結構,來記錄接下來需要訪問的節點。morris方法的先序遍曆和中序遍曆很相似,隻有一句代碼的位置不一樣。對於morris方法不太了解的同學可以參考的前一篇文章:LeetCode題目詳解——Binary Tree Preorder Traversal 代碼如下:
class Solution {
public:
    vector<int> inorderTraversal(TreeNode *root) {
        vector<int> result;
        TreeNode *p=root;
        if(!root)
            return result;
        while(p)
        {
            if(p->left==NULL)
            {
                result.push_back(p->val);
                p=p->right;
            }
            else
            {
                TreeNode *tmp=p->left;
                while(tmp->right && tmp->right!=p)
                {
                    tmp=tmp->right;
                }
                if(tmp->right==NULL)
                {
                    tmp->right=p;
                    p=p->left;
                }
                else
                {
                    result.push_back(p->val);//隻有這句代碼的位置和先序遍曆的時候不太一樣
                    tmp->right=NULL;
                    p=p->right;
                }
            }
        }
        return result;
    }
    
};


最後更新:2017-04-03 05:39:57

  上一篇:go Kafka詳解五、Kafka Consumer的底層API- SimpleConsumer
  下一篇:go Asp.net相關書籍