概述
参考
- 帮你对二叉树不再迷茫,彻底吃透前中后序递归法(递归三部曲)和迭代法(不统一写法与统一写法)
- 二叉树的前、中、后序遍历(递归与非递归)
算法
通过插入标志符,来标记需要输出哪个元素。
- 确定输出顺序。首次遍历结点A时,将A和其左右子结点按照遍历顺序插入到栈中,A结点后需要插入标志符。
- 输出结点元素。如果当前栈顶元素是标志符,说明A结点该输出了,输出A结点即可。
参考博文1中,用null作为标志符,这在要求输出空结点时不可行,标志符和空结点会发生冲突。要解决冲突,只需自定义标识符即可,详见下述代码。如果空结点需要区分左空结点和右空结点,可以再自定义两个标识符来处理。
前序遍历
public void preOrderTraverse3(ListNode<String> root) {
System.out.println("前根遍历-非递归");
Stack<ListNode<String>> stack = new Stack<>();
stack.push(root);
ListNode<String> cur;
ListNode<String> flag = new ListNode<>("0");//标识符
while (!stack.isEmpty()) {
cur = stack.pop();
if (cur == null) {
System.out.printf("^");
} else if (cur == flag) {
cur = stack.pop();
System.out.printf(cur.val);
} else {
stack.push(cur.right);//右
stack.push(cur.left);//左
stack.push(cur);//中
stack.push(flag);
}
}
System.out.printf("n");
}
中序遍历
public void inOrderTraverse3(ListNode<String> root) {
System.out.println("中根遍历-非递归");
Stack<ListNode<String>> stack = new Stack<>();
stack.push(root);
ListNode<String> cur;
ListNode<String> flag = new ListNode<>("0");//标识符
while (!stack.isEmpty()) {
cur = stack.pop();
if (cur == null) {
System.out.printf("^");
} else if (cur == flag) {
cur = stack.pop();
System.out.printf(cur.val);
} else {
stack.push(cur.right);//右
stack.push(cur);//中
stack.push(flag);
stack.push(cur.left);//左
}
}
System.out.printf("n");
}
后序遍历
public void postOrderTraverse3(ListNode<String> root) {
System.out.println("后根遍历-非递归");
Stack<ListNode<String>> stack = new Stack<>();
stack.push(root);
ListNode<String> cur;
ListNode<String> flag = new ListNode<>("0");//标识符
while (!stack.isEmpty()) {
cur = stack.pop();
if (cur == null) {
System.out.printf("^");
} else if (cur == flag) {
cur = stack.pop();
System.out.printf(cur.val);
} else {
stack.push(cur);//中
stack.push(flag);
stack.push(cur.right);//右
stack.push(cur.left);//左
}
}
System.out.printf("n");
}
最后
以上就是儒雅大神为你收集整理的二叉树的前、中、后序遍历统一写法参考算法的全部内容,希望文章能够帮你解决二叉树的前、中、后序遍历统一写法参考算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复