二叉樹的中序遍歷(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 基本思想>> 先序遍歷:根——>左——>右 先序遍歷:左——>