演算法題 二叉樹的中序遍歷

2021-10-07 17:03:34 字數 1974 閱讀 5684

題目描述:

給定乙個二叉樹,返回它的中序 遍歷。

示例:

輸入: [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,則說明棧頂元...