二叉樹的遍歷演算法 DFS和BFS

2021-10-07 06:41:04 字數 1862 閱讀 7115

遞迴演算法

迭代演算法與遞迴演算法比較

廣度優先遍歷(bfs)

/* definition for a binary tree node. */

public

class

treenode

}

用乙個stack進行輔助

class

solution

stack.

push

(root)

;while

(!stack.

isempty()

)if(node.left != null)

}return res;

}}

用乙個stack進行輔助

class

solution

curr = stack.

pop();

res.

add(curr.val)

; curr = curr.right;

}return res;

}}

後序遍歷相較於前兩種更複雜一些,有兩種方法。

方法一:

用乙個stack進行輔助,mark標記了上乙個訪問過的節點,在判斷節點是否入棧時將mark作為判斷條件之一,這樣就避免了訪問過的節點再次入棧。

class

solution

else

if(top.right != null && top.right != mark)

else

}return res;

}}

方法二:

用了兩個stack進行輔助,思路是將待訪問的節點按照逆序push進stack2,然後遍歷stack2的順序即為後續遍歷的順序。之所以能夠這麼做是因為我們最先訪問的節點是父節點,這個節點在後續遍歷中最後訪問,我們就可以將它最先push進stack2,然後再push右子節點、左子節點。在push右子節點時,它本身也是乙個父子節點,所以再push它的右子節點、左子節點。這種遞迴關係被儲存在stack1中,使得節點按照順序push進stack2中。

class

solution

while

(!stack2.

isempty()

)return res;

}}

遞迴演算法比較簡單,這裡不再贅述

因為每乙個節點都要被訪問,所以兩種方法的時間複雜度都為o(n)。對於空間複雜度,遞迴演算法的空間複雜度為o(n),當樹很大時,會出現stackoverflow的問題。迭代演算法由於借助了stack,最壞的情況下節點全部入棧,因此空間複雜的也為o(n),同樣存在stackoverflow的問題。

值得注意的是,有一種迭代演算法可以將空間複雜度降低到o(1),它就是morris迭代演算法

class

solution

public

void

helper

(treenode node,

int level, list

> res)

}

每次迭代都建立新的一層,把這層上的節點(被儲存在queue中)的值放進去,並按從左到右的順序把每個節點的左右子節點放進queue,作為下一層的節點儲存下來。

class

solution

level++;}

return res;

}}

兩種演算法的時間複雜度和空間複雜度都為o(n)。

二叉樹DFS和BFS遍歷

public class treenode bfs廣度優先遍歷 使用queue實現bfs public void bfswithqueue treenode root dfs 深度優先遍歷 採用 遞迴棧 或者 棧 遞迴棧 dfs遞迴實現 public void dfswithrecursion tr...

二叉樹的dfs遍歷

bt均為樹的根節點,建立好樹的時候返回的是根節點,類似煉表頭指標 先序遍歷 function preorder bt console.log bt.data preorder bt.left preorder bt.right 中序遍歷 function inorder bt inorder bt....

二叉樹的層序遍歷 二叉樹 BFS

給你乙個二叉樹,請你返回其按 層序遍歷 得到的節點值。即逐層地,從左到右訪問所有節點 示例 二叉樹 3,9,20,null,null,15,7 返回其層次遍歷結果 3 9,20 15,7 在用bfs迴圈遍歷時。先記錄現在佇列裡面的元素個數n,n就是此二叉樹這一深度擁有的節點數,然後迴圈n次,把n個節...