1. 程式人生 > >LeetCode:二叉樹的中序遍歷(遞迴與非遞迴法)

LeetCode:二叉樹的中序遍歷(遞迴與非遞迴法)

二叉樹結點類:

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x): val(x), left(NULL), right(NULL) {}
};

遞迴法: 

class Solution{

public:

    void inOrder(TreeNode *root, vector<int> &vec)
    {
        if(root != NULL)
        {
            inOrder(root->left, vec);

            vec.push_back(root->val);
            
            inOrder(root->right, vec);        
        }
    }

    vector<int> inorderTraversal(TreeNode *root)
    {
        vector<int> vec;
        inOrder(root, vec);
        return vec;
    }

非遞迴法:

藉助棧來實現中序遍歷(左根右):

程式碼1:

class Solution {
public:
    vector<int> inorderTraversal(TreeNode *root) {
        vector<int> res;
        if(root == NULL)
            return res;
        stack<TreeNode *> st;

        TreeNode *p = root;

        while(p || st.size())
        {
            if(p)
            {
                st.push(p);
                p = p->left;
            }
            else
            {
                 p = st.top();
                 st.pop();
                 res.push_back(p);
                 p = p->right;  
            }
        }        

        return res;
    }
};

程式碼2:

class Solution {
public:
    vector<int> inorderTraversal(TreeNode *root) {
        vector<int> res;
        if(root == NULL)
            return res;
        stack<TreeNode *> st;

        TreeNode *p = root;
        while(p || st.size())
        {
            while(p)
            {
                st.push(p);
                p = p->left;
            }
            if(st.size())
            {
                 p = st.top();
                 st.pop();
                 res.push_back(p);
                 p = p->right;  
            }
        }        

        return res;
    }
};

程式碼3:(有待驗證)

class Solution {
public:
    vector<int> inorderTraversal(TreeNode *root) {
        vector<int> res;
        if(root == NULL)
            return res;
        stack<TreeNode *> st;

        TreeNode *p = root;
        st.push(p);
        while(p || st.size())
        {
            while(p->left)
            {
                p = p->left;
                st.push(p);
            }
            if(st.size())
            {
                 p = st.top();
                 st.pop();
                 res.push_back(p);
                 p = p->right;  
            }
        }        

        return res;
    }
};

相關推薦

演算法及C語言實現

二叉樹中序遍歷的實現思想是: 訪問當前節點的左子樹; 訪問根節點; 訪問當前節點的右子樹; 圖 1 二叉樹   以圖  1 為例,採用中序遍歷的思想遍歷該二叉樹的過程為: 訪問該二叉樹的根節點,找到 1; 遍歷節點 1 的左子樹,找到節點 2; 遍歷節點 2 的左子樹,找到節點 4;

數據結構35和後

tdi 代碼 nod 完成 循環 同時 reat pan 設置 遞歸算法底層的實現使用的是棧存儲結構,所以可以直接使用棧寫出相應的非遞歸算法。 先序遍歷的非遞歸算法 從樹的根結點出發,遍歷左孩子的同時,先將每個結點的右孩子壓棧。當遇到結點沒有左孩子的時候,取棧頂的右

Leetcode 94. Binary Tree Inorder Traversalt ()

原題 Given a binary tree, return the inorder traversal of its nodes’ values. Example: Input: [1,null,2,3] 1 \ 2 / 3 Output

關鍵詞////搜尋/根搜尋

中序遍歷二叉樹 遞迴演算法 def inorderTraversal(root): f = self.inorderTraversal return f(root.left)+[root.val]+f(root.right) if root else [] 非遞迴演算法

LeetCode】Binary Tree Inorder Traversal 以及演算法

  Total Accepted: 16494 Total Submissions: 47494 Given a binary tree, return the inorder traversal of its nodes' values. For example: Giv

binary-tree-inorder-traversal——

str () init inorder code while urn value public Given a binary tree, return the inordertraversal of its nodes‘ values. For example:Given

的下一個節點

while tro struct 包含 sub 順序 其中 itl lin 題目描述 給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。註意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。 思路:分多種情況討論 1

4685:

輸入數據 spa clu IT med 提示 break tro font 輸入數據分為多組,第一行是測試數據的組數n,下面的n行分別代表一棵二叉樹。每棵二叉樹的結點均為正整數,數據為0代表當前結點為空,數據為-1代表二叉樹數據輸入結束,-1不作處理。二叉樹的構造按照層次順

【劍指offer】8、的下一個節點

pan color col amp nullptr nbsp 父節點 public turn 題目 給定一個二叉樹和其中一個節點,找出中序遍歷的下一個節點。註意:樹的節點中除了有指向左右節點的指針,還有指向父節點的指針。 思路 (1)若該節點Node有右子樹,則下一個節點就

歸寫法

sqs nor amp style mage 中序遍歷 遞歸 ack stack 中序遍歷比前序要稍微復雜些,我也先用手寫理出思路 代碼寫的和書上的一比。。。感覺麻煩了好多,但畢竟是自己理的思路不容易忘,所以還是貼自己的 void inOrder_stack(BiTre

[Leetcode 144]Binary Tree Preorder Traversal

public list left 前序 output nod roo strong while 【題目】 Given a binary tree, return the preordertraversal of its nodes‘ values. Example: Inp

演算法--20181109--實現

1.二叉樹的中序遍歷 首先看一下遞迴方式的實現方式: class TreeNode: left = None right = None var = 0 def __init__(self, var): self.var = var

、後和層實現

一、中序遍歷 訪問順序:左子樹 -> 結點 -> 右子樹 難點在於訪問左子樹後應該怎麼回到結點本身或者其右子樹呢?這裡利用了堆疊來臨時儲存,需要利用上一個結點時可以pop出來(有種撤回鍵的感覺2333)。 void PreOrderTravel(BinTree BT){

關鍵詞///層/層次

二叉樹層序遍歷 實現 def levelOrder(self, root): if root is None: return [] res = [] queue = [root]

()演算法實現--C語言

今天繼續二叉樹的學習。 昨天寫了一遍二叉樹的先序遍歷(非遞迴)演算法,今天寫一下二叉樹的二叉樹的中序遍歷(非遞迴)演算法。中序遍歷的非遞迴演算法有兩種,但是個人覺得只要掌握一種就可以了,只要自己的邏輯清晰,會哪一種又有什麼關係呢~ 首先給出今天的二叉樹的示例圖: 程式碼如下:

給定一個二叉樹,返回它的中序 遍歷。 示例: 輸入: [1,null,2,3] 1 \ 2 / 3 輸出: [1,3,2] import java.util.*; class Solution { public List&

面試題目整理--20181109--實現

非遞迴實現二叉樹的中序遍歷 首先看一下遞迴方式的實現方式: class TreeNode: left = None right = None var = 0 def __init__(self, var): self.var

——的下一個節點

題目描述 給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。分析二叉樹的下一個節點,一共有以下情況: 1.二叉樹

leetcode 145+590 iterative附589,144,94

題目描述 145. Binary Tree Postorder Traversal Given a binary tree, return the postorder traversal of its nodes' values. Example: Input: [1,nu

,不用棧實現

  最近總有人問這個問題:“如何不用棧,也不用遞迴來實現二叉樹的中序遍歷”。這個問題的實現就是迭代器問題,無論是Java還是C++,利用迭代器遍歷樹節點(Java中是TreeMap類,C++中是map類)都使用了中序遍歷,且無法使用遞迴和棧,演算法效率近似為O(1),不可能