先序遍歷:根節點 -> 左子樹 -> 右子樹
中序遍歷:左子樹 -> 根節點 -> 右子樹
後序遍歷:左子樹 -> 右子樹 -> 根節點
如,以下二叉樹遍歷:
先序遍歷結果:1 2 4 5 7 8 3 6
中序遍歷結果:4 2 7 5 8 1 3 6
後序遍歷結果:4 7 8 5 2 6 3 1
二叉樹基本結構
1一、先序遍歷function
treenode(val)
1function
previsitrecursive(root)
7 }
1二、中序遍歷function
previsit(root) else12}
13 }
1function
midvisitrecursive(root)
7 }
1三、後序遍歷function
midvisit(root) else12}
13 }
11)對於任一結點p,將其入棧,然後沿其左子樹一直往下搜尋,直到搜尋到沒有左孩子的結點,此時該結點出現在棧頂,但是此時不能將其出棧並訪問,因為其右孩子還未被訪問。function
postvisitrecursive(root)
7 }
所以接下來按照相同的規則對其右子樹進行相同的處理,當訪問完其右孩子時,該結點又出現在棧頂,此時可以將其出棧並訪問。這樣就保證了正確的訪問順序。
可以看出,在這個過程中,每個結點都兩次出現在棧頂,只有在第二次出現在棧頂時,才能訪問它。因此需要多設定乙個變數標識該結點是否是第一次出現在棧頂。
1view codefunction
postvisit(root) else
else 20}
21}22}
23 }
覺得不錯的另外的實現
2)要保證左子節點和右子節點都被訪問之後才能訪問根節點。對於任一節點p,先將其入棧。如果其不存在左子節點和右子節點,可直接訪問;亦或其存在左子節點或右子節點,且其左子節點和右子節點已被訪問過,則可直接訪問該節點;其他情況下,則將其右子節點和左子節點依次入棧,這樣保證了出棧時左子節點在右子節點之前被訪問,根節點在子節點之後被訪問
1view codefunction
postvisit(root) else
17if
(curnode.left) 20}
21}22 }
四、二叉樹與陣列相結合
從二叉搜尋樹(bst)中找出是否存在兩個節點的和等於某個值k
1/**2* @param root
3* @param k
4* @return 5*/
6var findtarget = function
(root, k) else17}
18 let m = 0, n = numsarr.length - 1, sum = numsarr[m] +numsarr[n];
19while(m
24return
false
25 };
二叉樹的三種遍歷方法
定義二叉樹 鏈式儲存 struct binarytreenode 順序儲存 struct binarytreenode 遞迴實現 先序遍歷 int preordertreewalk binarytreenode pnode 中序遍歷 int inordertreewalk binarytreenod...
二叉樹的三種遍歷
重新又看了一遍二叉樹 binary tree 發現很多東西自己還沒有弄明白,原來三種遍歷方式還不是自己想象中的那樣 前序遍歷 preorder 是先輸出自己,然後左,最後右。中序遍歷 inorder 是先左,再輸出自己,最後右。後序遍歷 postorder 是先左,再右,最後輸出自己。所謂的xx遍歷...
二叉樹三種遍歷方式
三種遍歷方式是按照根節點的訪問順序來定義的 1 前序遍歷 先訪問根結點 然後遍歷左子樹,最後遍歷右子樹 並且,在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。根左右 2 中序遍歷 先遍歷左子樹 然後訪問根結點,最後遍歷右子樹 並且,在遍歷左 右子樹時,仍然先遍歷左子樹,然後訪問...