1. 程式人生 > >二叉樹的中序遍歷(lintcode)(遞迴和非遞迴)

二叉樹的中序遍歷(lintcode)(遞迴和非遞迴)

題目來源:lintcode

題目:

給出一棵二叉樹,返回其節點值的中序遍歷。

您在真實的面試中是否遇到過這個題? Yes 樣例

給出一棵二叉樹 {1,#,2,3},

1
    \
     2
    /
   3

返回 [1,3,2]

挑戰

你能使用非遞迴實現麼?

難度級別

容易

思路分析:

此題就是資料結構-樹-的常用遍歷方式的實現。

一般普通教材上都會提供中序遍歷的常規方法,即採用遞迴方式求解。

本題的挑戰就是採用非遞迴的方式進行求解,那麼我就對此進行了嘗試。

我們可以想到,遞迴的方式,是一種棧的資料結構,也就是說傳統採用遞迴的方式,是藉助函式棧的方式進行處理的,是一種比較隱蔽的先入先出模式。

那麼我們可以採用資料結構-棧-來模擬函式棧的方式進行求解。

將未資料域未遍歷到的節點存入到stack中,用cur來指向當前節點;那麼就有cur為空或者非空兩種情況,我們分開討論。

1)當cur為空的時候,也就是說我們需要從stack中取出下一個節點記為temp,那麼此時的節點中資料域就需要存入到我們的結果陣列中,並且如果該節點的右子節點也為空的話,我們此時就將cur指向右子節點(temp->right)(雖然不變也可以,但是本人覺得還是形式上保持一致比較好),如果該子節點的右子節點不為空的話,那麼我們將temp指向右子節點(即temp = temp->right),將temp放入stack中,並將cur指向此時的temp節點的左節點;

2)當cur不為空的時候,此種情況較為簡單,只要將cur放入stack中,並將cur指向當前節點的左節點,即 cur = cur->left;

實現程式碼:

<span style="font-size:14px;">#include <iostream>
#include <stack>
#include <vector>

using namespace std;

// Definition of TreeNode:
 class TreeNode {
 public:
     int val;
     TreeNode *left, *right;
     TreeNode(int val) {
         this->val = val;
         this->left = this->right = NULL;
     }
 };

class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: Inorder in vector which contains node values.
     */
public:
    //非遞迴版
    vector<int> inorderTraversal(TreeNode *root) {
        vector<int> result;
        if (root == NULL)
        {
            return result;
        }
        stack<TreeNode *> intStack;
        //queue<TreeNode *> intQueue;
        intStack.push(root);
        TreeNode *cur = root->left;
        while (!intStack.empty())
        {
            if (cur == NULL)
            {
                TreeNode *temp = intStack.top();
                intStack.pop();
                result.push_back(temp->val);
                if (temp->right != NULL)
                {
                    temp = temp->right;
                    intStack.push(temp);
                    cur = temp->left;
                }else
                {
                    cur = temp->right;
                }
            }else
            {
                intStack.push(cur);
                cur = cur->left;
            }
        }
        return result;
    }
    /*
    // 遞迴版本
    vector<int> inorderTraversal(TreeNode *root) {
        // write your code here
        vector<int> result;
        if (root == NULL)
        {
            return result;
        }else
        {
            inorderCore(root, result);
        }
        return result;
    }
    void inorderCore(TreeNode *root, vector<int> &result)
    {
        if (root->left != NULL)
        {
            inorderCore(root->left, result);
        }
        result.push_back(root->val);
        if (root->right != NULL)
        {
            inorderCore(root->right, result);
        }
        return;
    }
    */
};</span>

程式碼說明:

需要說明的是,本題我採用STL模板中的stack模板類進行求解的。

相關推薦

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

演算法--20181109--實現

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

、後實現

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

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 [] 非遞迴演算法

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

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

演算法及C語言實現

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

給定一個二叉樹,返回它的中序 遍歷。 示例: 輸入: [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

【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

——的下一個節點

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

,不用棧實現

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

演算法

我們知道,在深度搜索遍歷的過程中,之所以要用遞迴或者是用非遞迴的棧方式,參考二叉樹非遞迴中序遍歷,都是因為其他的方式沒法記錄當前節點的parent,而如果在每個節點的結構裡面加個parent 分量顯然是不現實的,那麼Morris是怎麼解決這一問題的呢?好吧,他用得很巧

無空間複雜度無棧

常見的二叉樹非遞迴演算法都是用棧儲存訪問路徑上的結點,這樣使空間複雜為o(n),其中n為樹最大深度。空間複雜度為o(1)的演算法並沒有以犧牲時間複雜度為代價,它只是巧妙的運用葉子結點左右孩子指標為空這一事實,將所有的葉子組成一鏈棧用於儲存回退資訊,其中葉子結點的lchild域

(lintcode)

題目來源:lintcode 題目: 給出一棵二叉樹,返回其節點值的中序遍歷。 您在真實的面試中是否遇到過這個題? Yes 樣例 給出一棵二叉樹 {1,#,2,3}, 1 \ 2 / 3 返回 [1,3,2] 挑戰

二叉樹 com size 基本 html 後序 href col spa 轉自:https://www.cnblogs.com/polly333/p/4740355.html 基本思想>>   先序遍歷:根——>左——>右   先序遍歷:左——>