import java.util.*;
import java.util.concurrent.LinkedTransferQueue;
class Node9 {
//定义变量
char value;
Node left;
Node right;
Node9(char value){
this.value=value;
}
}
class BinaryTree5{
//后续遍历
/*
* 1.后序遍历使用栈来进行遍历
* 2.我们要完成的是左右中;
* 3.先进行cur.left这样如果为空退出循环我们可以看到第一次是记录到了cur的值并没有进行出栈
* 4.然后跳到cur如果不为空我们跳转到cur=cur.right.
* 另一个情况cur.right如果为空时我们要注意先进行输出然后的话是需要将现在的cur进行出栈的操作
* 出栈后我们还需要定义个一个空的变量来记录现在要出栈的cur然后把我们的cur置为null
* 此时如果cur为null时我们的cur就又会走到cur==stack.peek()这样就会跳转到cur=cur.right再次陷入循环
* 所以我们在cur==null的判断条件里面加一个cur.right==flg这样就会进入此循环进行我们的后续遍历
*
* */
void postOrderTraversal2(Node root) {
Stack<Node> stack = new Stack<>();
Node cur = root;
Node flg = null;
while (cur != null || !stack.empty()) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.peek();
if (cur.right == null||cur.right==flg) {
System.out.print(cur.value + " ");
stack.pop();
flg=cur;
cur=null;
} else {
cur = cur.right;
}
}
}
//中序遍历(非递归)
void inOrderTraversal2(Node root){
Stack<Node>stack=new Stack<>();
Node cur=root;
while (cur!=null||!stack.empty()) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
System.out.print(cur.value + "");
cur = cur.right;
//中序遍历我们要打印的原则是左中右,当cur.left为空时候会记录cur
// 记录好之后会直接打印打印完跳转到right如果right为空时候代表此节点接收,cur会跳到上一个节点
//然后循环
}
}
//前序遍历(非递归)注意非递归我们需要借助栈来完成遍历;
void preOrderTraversal2(Node root) {
Stack<Node> stack = new Stack<>();
Node cur = root;
while (cur != null || !stack.empty()) {
while (cur != null) {
stack.push(cur);
System.out.println(cur);
cur = cur.left;
}
cur = stack.pop();
cur = cur.right;//此时我们要想到如果发生right为空时我们如何让程序继续往下走
// ,放入循环之中但是此时cur是空的但是我们的栈内是有元素的加条件
//非递归我们首先考虑如何入栈,如何打印
}
}
//后续遍历(递归)
void postOrderTraversal (Node root){
if (root == null) {
return;
}
postOrderTraversal(root.left);
postOrderTraversal(root.right);
System.out.print(root.value + " ");
//首先一次走在我们最左边知道root.left为空时我们跳到下一步判断right是否为
// 空如果为空我们跳到第三步的打印上这样就会按照后续依次进行打印
}
//中序遍历(递归)
void inOrderTraversal(Node root){
if (root==null){
return;
}
inOrderTraversal(root.left);
System.out.print(root.value+" ");
inOrderTraversal(root.right);
//中序递归我们首先一次走到root.left,当root.left==null时候我们跳到打印;
//打印完成后跳到root.right,如果为空返回至上一节点
// 如果走到这步代表是左子树是完成的我们只需要将节点再次打印然后再看root.right的情况
}
//前序遍历(递归)
void preOrderTraversal(Node root){
if (root==null){
return;
}
System.out.print(root.value+" ");
preOrderTraversal(root.left);
preOrderTraversal(root.right);
//如果直接root的left和right都为空代表此节点出栈自动会返回到上一节点
}
//建立一个树
public Node buildTree5(){
Node A=new Node('A');
Node B=new Node('B');
Node C=new Node('C');
Node D=new Node('D');
Node E=new Node('E');
Node F=new Node('F');
Node G=new Node('G');
Node H=new Node('H');
A.left=B;
A.right=C;
B.left=D;
B.right=D;
B.right=E;
E.right=H;
C.left=F;
C.right=G;
return A;
}
二叉树前中后遍历
最新推荐文章于 2024-07-28 17:42:24 发布