如何在不使用遞迴的情況下遍歷一棵二杈樹
阿新 • • 發佈:2018-11-06
如何在不使用遞迴的情況下遍歷一棵二杈樹
使用工具:迴圈 + 棧;
其實遞迴也是使用了記憶體中的棧。
思想如下:
對左節點依次做, 入棧
直到一個節點不存在左孩子時,出棧
出棧後,看其是否存在右孩子,
不存在,繼續出棧
存在,則將其右孩子,入棧 …… 如此迴圈。
示例程式碼:
//將節點存入一個list中,得到一個排序好的集合(對排序樹遍歷)
List<Note> list = new ArrayList<Note>();
Stack<Note> stack = new Stack<Note> ();
//先取樹的根節點
Note note = this.root;
do {
//入棧
stack.push(note);
//如果節點存在左孩子,則繼續入棧
if (note.lchild != null) {
note = note.lchild;
}
//出棧
else {
while (true){
note = stack.pop();
list.add(note);
if (null != note.rchild) {
note = note.rchild;
break;
}
}
}
} while (stack.size() != 0 || note.rchild != null);
如何刪除一個二杈排序樹的非葉子節點?
- 用該節點左樹的最大結點替換該節點(左小右大時)
- 用該節點右樹的最小結點替換該節點(左小右大時)