題目描述:
給定乙個二叉樹,返回它的中序 遍歷。
示例:
輸入: [1,null,2,3]1\
2/
3輸出: [1,3,2]
高階: 遞迴演算法很簡單,你可以通過迭代演算法完成嗎?
解法一通過遞迴實現。時間複雜度:o(n),空間複雜度:平均是o(logn)(樹的高度)。最壞是o(n)(當樹退化成煉表時)。
/**
* definition for a binary tree node.
* public class treenode
* }*/class
solution
private
void
inorder
(treenode root,list
ans)
//訪問根結點
ans.
add(root.val)
;//右節點不為空,訪問右子樹
if(root.right != null)}}
}
解法二
利用棧,使用迭代。時間複雜度:o(n)。空間複雜度:o(n)。
/**
* definition for a binary tree node.
* public class treenode
* }*/class
solution
//當左孩子都入棧之後,將之出棧,並將其值加入ans,將其右孩子入棧
current = stack.
pollfirst()
; ans.
add(current.val)
;//如果當前節點沒有右孩子,則進入下一次迴圈,將其父節點出棧返回。
current = current.right;
}return ans;
}}
解法三
使用棧、迭代。但是將先序、中序和後序遍歷的迭代式**統一了。
只需更改右孩子、當前節點、左孩子的入棧順序,就可以實現三種遍歷方式。
/**
* definition for a binary tree node.
* public class treenode
* }*///定義乙個類,表示結點與其對應顏色
public
class
colornode
}//第一次遍歷到的結點都設定為白色「white」
//第二次遍歷到的結點設定為灰色「gray」
//如果遇到白色的結點,更改其顏色為灰色,並將其右孩子、自身、左孩子分別入棧
//如果遇到灰色結點,將其值加入ans中
class
solution
list
ans =
newarraylist
<
>()
; deque
stack =
newlinkedlist
<
>()
;//把根結點設定為白色,放入棧中
stack.
offerfirst
(new
colornode
(root,
"white"))
;while
(!stack.
isempty()
)//將當前結點更改為灰色,入棧
stack.
offerfirst
(new
colornode
(cn.node,
"gray"))
;//如果當前結點有左孩子,將左孩子設定為白色,入棧
if(cn.node.left != null)
}//遇到灰色結點,將其值加入ans中
else
}return ans;
}}
演算法題 二叉樹的垂序遍歷
給你二叉樹的根結點 root 請你設計演算法計算二叉樹的 垂序遍歷 序列。對位於 row,col 的每個結點而言,其左右子結點分別位於 row 1,col 1 和 row 1,col 1 樹的根結點位於 0,0 二叉樹的 垂序遍歷 從最左邊的列開始直到最右邊的列結束,按列索引每一列上的所有結點,形成...
二叉樹中序遍歷
訪問根結點的的左子樹,訪問根結點和訪問根結點的右子樹依次記作 l,d r 中序遍歷 ldr 演算法 遍歷根結點的左子樹,訪問根結點 遍歷根結點的右子樹 對於上面的圖,我們假定只有a,b,c三個結點,則中序遍歷結果為 b a c 採用上節 二叉樹鏈式儲存和前序遍歷 中的遞迴推演 db a c d b ...
二叉樹中序遍歷
二叉樹中序遍歷 非遞迴版本的中序遍歷用棧來實現。乙個元素出現在棧頂一次,這一次會被處理並出棧。trick 用乙個指標去記錄當前節點cur,如果cur left左側還未遍歷,就會將cur入棧並訪問cur left。一行很重要的 是cur cur right,這一句之後如果cur null,則說明棧頂元...