二叉树遍历

1.什么是二叉树
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树
[图片]
2.二叉树的遍历
2.1认识递归序
递归一棵树的时候,如果完全递归结束,每个结点可以回到3次;
二叉树作为一种简单的树结构,它的遍历按照顺序可以划分为三种:
先序遍历:对于每一棵子树,依次访问其根节点→左子节点→右子节点
中序遍历:对于每一棵子树,依次访问其左子节点→根节点→右子节点
后序遍历:对于每一棵子树,依次访问其左子节点→右子节点→根节点
[图片]
2.2先序遍历

public class RecursiveTraversalBT {

public static class Node {
public int value;
public Node left;
public Node right;

  public Node(int  v) {
     value = v;
  }

}

// 先序打印所有节点
public static void pre(Node head) {
if (head == null) {
return;
}
System.out.println(head.value);
pre(head.left);
pre(head.right);
}

public static void pre2(Node head) {
System.out.print("pre-order: ");
if (head != null) {
Stack stack = new Stack();
stack.add(head);
while (!stack.isEmpty()) {
head = stack.pop();
System.out.print(head.value + " ");
if (head.right != null) {
stack.push(head.right);
}
if (head.left != null) {
stack.push(head.left);
}
}
}
System.out.println();
}
}
2.3中序遍历
当我们对那棵树执行了一次中序遍历之后,我们最终得到的元素值的序列,就是一个升序的序列了。
public class RecursiveTraversalBT {

public static class Node {
public int value;
public Node left;
public Node right;

  public Node(int  v) {
     value = v;
  }

}

//中序打印所以节点
public static void in(Node head) {
if (head == null) {
return;
}
in(head.left);
System.out.println(head.value);
in(head.right);
}

public static void in2(Node cur) {
   System.out.print("in-order: ");
   if (cur != null) {
      Stack<Node> stack = new Stack<Node>();
      while (!stack.isEmpty() || cur != null) {
         if (cur != null) {
            stack.push(cur);
            cur = cur.left;
         } else {
            cur = stack.pop();
            System.out.print(cur.value + " ");
            cur = cur.right;
         }
      }
   }
   System.out.println();
   }

}
2.4后序遍历
public class RecursiveTraversalBT {

public static class Node {
public int value;
public Node left;
public Node right;

  public Node(int  v) {
     value = v;
  }

}

//后序序打印所以节点
public static void pos(Node head) {
   if (head == null) {
      return;
   }
   pos(head.left);
   pos(head.right);
   System.out.println(head.value);
}


public static void pos1(Node head) {
   System.out.print("pos-order: ");
   if (head != null) {
      Stack<Node> s1 = new Stack<Node>();
      Stack<Node> s2 = new Stack<Node>();
      s1.push(head);
      while (!s1.isEmpty()) {
         head = s1.pop(); // 头 右 左
         s2.push(head);
         if (head.left != null) {
            s1.push(head.left);
         }
         if (head.right != null) {
            s1.push(head.right);
         }
      }
      // 左 右 头
      while (!s2.isEmpty()) {
         System.out.print(s2.pop().value + " ");
      }
   }
   System.out.println();
   }
   
   public static void pos2(Node h) {
       System.out.print("pos-order: ");
       if (h != null) {
          Stack<Node> stack = new Stack<Node>();
          stack.push(h);
          Node c = null;
          while (!stack.isEmpty()) {
             c = stack.peek();
             if (c.left != null && h != c.left && h != c.right) {
                stack.push(c.left);
             } else if (c.right != null && h != c.right) {
                stack.push(c.right);
             } else {
                System.out.print(stack.pop().value + " ");
                h = c;
             }
          }
       }
       System.out.println();
    }

}
2.5练习
先序遍历:https://leetcode.cn/problems/binary-tree-preorder-traversal/
中序遍历:https://leetcode.cn/problems/binary-tree-inorder-traversal/
后序遍历:https://leetcode.cn/problems/binary-tree-postorder-traversal/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值