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),不可能