public void preOrder1(HereNode Root) {
if (Root == null) {
System.out.println("空树");
return;
}
HereNode tmp = Root;
Stack<HereNode> s = new Stack<HereNode>();
s.push(tmp); //根节点入栈
while (!s.empty()) {
//1.访问根节点
HereNode p = s.pop();
System.out.print(p);
System.out.println();
//2.如果根节点存在右孩子,则将右孩子入栈
if (p.getRight() != null) {
s.push(p.getRight());
}
//3.如果根节点存在左孩子,则将左孩子入栈
if (p.getLeft() != null) {
s.push(p.getLeft());
}
}
System.out.println();
}
//中序遍历非递归方法,利用栈
public void midOrder1(HereNode Root) {
if (Root == null) {
System.out.println("空树");
return;
}
HereNode tmp = Root;
Stack<HereNode> s = new Stack<HereNode>();
while (tmp != null || !s.empty()) {
//1.将根节点入栈
//2.将所有左孩子入栈
while (tmp != null) {
s.push(tmp);
tmp = tmp.getLeft();
}
//3.访问栈顶元素
tmp = s.pop();
System.out.print(tmp);
System.out.println();
//4.如果栈顶元素存在右孩子,则将右孩子赋值给tmp,也就是将右孩子入栈
if (tmp.getRight() != null) {
tmp = tmp.getRight();
}
//否则,将tmp置为null,表示下次要访问的是栈顶元素
else {
tmp = null;
}
}
System.out.println();
}
//后序遍历非递归方法
public void postOrder1(HereNode Root) {
if (Root == null) {
System.out.println("空树");
return;
}
HereNode tmp = Root; //当前节点
HereNode prev = null; //上一次访问的节点
Stack<HereNode> s = new Stack<HereNode>();
while (tmp != null || !s.empty()) {
//1.将根节点及其左孩子入栈
while (tmp != null) {
s.push(tmp);
tmp = tmp.getLeft();
}
if (!s.empty()) {
//2.获取栈顶元素值
tmp = s.peek();
//3.没有右孩子,或者右孩子已经被访问过
if (tmp.getRight() == null || tmp.getRight() == prev) {
//则可以访问栈顶元素
tmp = s.pop();
System.out.print(tmp);
System.out.println();
//标记上一次访问的节点
prev = tmp;
tmp = null;
}
//4.存在没有被访问的右孩子
else {
tmp = tmp.getRight();
}
}
}
System.out.println();
}
二叉树的三种非递归遍历方法
最新推荐文章于 2022-12-09 18:31:27 发布