如何在不使用递归的情况下遍历一棵二杈树
使用工具:循环 + 栈;
其实递归也是使用了内存中的栈。
思想如下:
对左节点依次做, 入栈
直到一个节点不存在左孩子时,出栈
出栈后,看其是否存在右孩子,
不存在,继续出栈
存在,则将其右孩子,入栈 …… 如此循环。
示例代码:
//将节点存入一个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);
如何删除一个二杈排序树的非叶子节点?
- 用该节点左树的最大结点替换该节点(左小右大时)
- 用该节点右树的最小结点替换该节点(左小右大时)