二叉樹的遍歷有三種形式:前序遍歷、中序遍歷、後序遍歷,三種遍歷的規則分別如下:
1)前序遍歷:先遍歷根節點,然後遍歷左子節點,最後遍歷右子節點,簡記為「根-左-右」;
2)中序遍歷:先遍歷左子節點,然後遍歷根節點,最後遍歷右子節點,簡記為「左-根-右」;
3)後序遍歷:先遍歷左子節點,然後遍歷右子節點,最後遍歷根節點,簡記為「左-右-根」;
如果記性不好的朋友,總是記錯,可以這麼理解,前、中、後指的都是根的遍歷順序,然後無論何種遍歷,左節點都比右節點優先遍歷~
其實這都是大一時候學習的東西了,想想自己大一的時候還是比較墮落,連這個都沒親手實現過,那個時候遇到了困難就容易滋生恐懼,導致現在對資料結構演算法都還心存陰影。這是乙個不可以原諒的錯誤!回不到過去,只是在現在的時間加倍的補回來。只有與惡龍纏鬥才能享受斬殺其瞬間的快感,只有直面自己內心的深淵,才能夠找到光明。沒有困難是克服不了的!
話不多說,開始上**。我們先嘗試用遞迴實現:
/**
* 定義節點類
* @author keo.zhao
* */
public class treenode
public void setdata(t data)
public treenodegetleft()
public void setleft(treenodeleft)
public treenodegetright()
public void setright(treenoderight)
public treenode(t data, treenodeleft, treenoderight)
}
然後我們定義一顆二叉樹,其中包含了遍歷的方法:
/**
* 二叉樹定義類
* @author keo.zhao
* * @param */
public class bintree
public treenodegetroot()
public void setroot(treenoderoot)
/*** 遞迴先序遍歷
*/public void preorder(treenoderoot)
} /**
* 遞迴中序遍歷
*/public void midorder(treenoderoot)
} /**
* 遞迴後序遍歷
*/public void afterorder(treenoderoot)
}}
遞迴的思想比較簡單,**也比較簡潔,但是實際開發中最好還是不要用遞迴。所以我們可以嘗試,用迭代的思想去實現。
這裡用到了stack,棧是vector的乙個子類,它實現了乙個標準的後進先出的棧。
堆疊只定義了預設建構函式,用來建立乙個空棧。 堆疊除了包括由vector定義的所有方法,也定義了自己的一些方法。
在使用迭代的方式遍歷的過程中,需要維護乙個棧用來儲存遍歷的節點資訊,相應**如下所示:
/**
* 非遞迴的前序遍歷實現
* @param root
*/public void iterativepreorder(treenoderoot)
stack> stack = new stack>();
stack.push(root);
while(!stack.isempty())
treenodep= stack.pop();
if(!stack.isempty())
}
二叉樹的前中後序遍歷
秋招記錄 對一棵二叉樹進行遍歷,我們可以採取3種順序進行遍歷,分別是前序遍歷 中序遍歷和後序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設父節點是n,左節點是l,右節點是r,那麼對應的訪問遍歷順序如下 前序遍歷 中左右 n l r 中序遍歷 左中右 l n r 後序遍歷 左右中 l r n ...
二叉樹的前 中 後序遍歷
import lombok.data import lombok.noargsconstructor data noargsconstructor class treenode 前序遍歷 根 左 右 public void preorder 遞迴向右子樹前序遍歷if this right null ...
二叉樹的前 中 後序遍歷
前序 根左右 中序 左根右 後序 左右根 前序遍歷 124563 中序遍歷 546213 後序遍歷 564231 package datastructure public class binarytreedemo class binarytree public binarytree hero roo...