风也温柔

计算机科学知识库

【】叶子节点的操作分析与操作策略(上)

  文章目录

  为什么要引入树?

  二叉树 1、概念 1)二叉树 2)满二叉树、完全二叉树

  满二叉树:所有叶子节点都在最后一层,并且总节点数为2n-1(n为层数)

  在这里插入图片描述

  完全二叉树:叶子节点在最后一层和倒数第二层,并且最后一层的叶子节点在左边连续,倒数第二层叶子节点在右边连续

  在这里插入图片描述

  3)前序遍历中序遍历、后序遍历

  前序遍历:先输出父节点、再输出左子树、右子树

  中序遍历:先遍历左子树、再遍历父节点、再遍历右子树

  后序遍历:先遍历左子树、再遍历右子树、再遍历父节点

  tips:遍历的顺序根据父节点的顺序而定

  2、前中后序遍历 代码实现

   public class BinaryTreeDemo {

        public static void main(String[] args) {
            // 创建节点
            EmpNode node1 = new EmpNode(1,"heroc");
            EmpNode node2 = new EmpNode(2,"lucy");
            EmpNode node3 = new EmpNode(3,"smith");
            EmpNode node4 = new EmpNode(4,"tom");
            EmpNode node5 = new EmpNode(5,"jack");
            // 创建树
            node1.setLeft(node2);
            node2.setLeft(node3);
            node1.setRight(node4);
            node4.setLeft(node5);
            // 确定根节点,遍历树
            BinaryTree rootNode = new BinaryTree(node1);
    //        System.out.println("前序:");
    //        rootNode.perOrder();
    //        System.out.println("中序:");
    //        rootNode.centerOrder();
    //        System.out.println("后序:");
    //        rootNode.afterOrder();
            // 前序遍历查询
            EmpNode empNode = rootNode.perOrderFind(5);
            if (empNode!=null){
                System.out.println(empNode.toString());
            }
            // 中序遍历查询
            empNode = rootNode.perOrderFind(2);
            if (empNode!=null){
                System.out.println(empNode.toString());
            }
            // 后序遍历查询
            empNode = rootNode.afterOrderFind(4);
            if (empNode!=null){
                System.out.println(empNode.toString());
            }
        }
    }
    // 创建节点
    class EmpNode{
        private int id;
        private String name;
        private EmpNode left;
        private EmpNode right;
        public EmpNode(int id, String name) {
            this.id = id;
            this.name = name;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public EmpNode getLeft() {
            return left;
        }
        public void setLeft(EmpNode left) {
            this.left = left;
        }
        public EmpNode getRight() {
            return right;
        }
        public void setRight(EmpNode right) {
            this.right = right;
        }
        @Override
        public String toString() {
            return "EmpNode{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
        // 前序遍历
        public void perOrder(){
            System.out.println(this.toString());
            if (this.left!=null){
                this.left.perOrder();
            }
            if (this.right!=null){
                this.right.perOrder();
            }
        }
        // 中序遍历
        public void centerOrder(){
            if (this.left!=null){
                this.left.centerOrder();
            }
            System.out.println(this.toString());
            if (this.right!=null){
                this.right.centerOrder();
            }
        }
        // 后续遍历
        public void afterOrder(){
            if (this.left!=null){
                this.left.afterOrder();
            }
            if (this.right!=null){
                this.right.afterOrder();
            }
            System.out.println(this.toString());
        }
        // 前序遍历查询
        public EmpNode perOrderFind(int id){
            if (this.id == id){
                return this;
            }
            EmpNode empNode = null;
            if (this.left!=null){
                empNode = this.left.perOrderFind(id);
            }
            if (empNode!=null){
                return empNode;
            }
            if (this.right!=null){
                empNode = this.right.perOrderFind(id);
            }
            if (empNode!=null){
                return empNode;
            }
            return null;
        }
        // 中序遍历查询
        public EmpNode centerOrderFind(int id){
            EmpNode empNode = null;
            // 向左查找
            if (this.left!=null){
                empNode = this.left.centerOrderFind(id);
            }
            if (empNode!=null){ // 如果empNode不等null,说明找到了,就返回结果
                return empNode;
            }
            // 当前节点
            if (this.id == id){
                return this;
            }
            // 向右查找
            if (this.right != null){
                empNode = this.right.centerOrderFind(id);
            }
            if (empNode!=null){
                return empNode;
            }
            // 都没找到返回null
            return empNode;
        }
        // 后序遍历查询
        public EmpNode afterOrderFind(int id){
            EmpNode empNode = null;
            // 向左查找
            if (this.left!=null){
                empNode = this.left.centerOrderFind(id);
            }
            if (empNode!=null){ // 如果empNode不等null,说明找到了,就返回结果
                return empNode;
            }
            // 向右查找
            if (this.right != null){
                empNode = this.right.centerOrderFind(id);
            }
            if (empNode!=null){
                return empNode;
            }
            // 当前节点
            if (this.id == id){
                return this;
            }
            return empNode;
        }
    }
    // 创建根节点
    class BinaryTree{
        private EmpNode root;
        public BinaryTree(EmpNode root) {
            this.root = root;
        }
        public void perOrder(){
            if (root!=null){
                root.perOrder();
            }else {
                System.out.println("树为空");
            }
        }
        public void centerOrder(){
            if (root!=null){
                root.centerOrder();
            }else {
                System.out.println("树为空");
            }
        }
        public void afterOrder(){
            if (root!=null){
                root.afterOrder();
            }else {
                System.out.println("树为空");
            }
        }
        public EmpNode perOrderFind(int id){
            if (root!=null){
                return root.perOrderFind(id);
            }else {
                System.out.println("树为空");
                return null;
            }
        }
        public EmpNode centerOrderFind(int id){
            if (root!=null){
                return root.centerOrderFind(id);
            }else {
                System.out.println("树为空");
                return null;
            }
        }
        public EmpNode afterOrderFind(int id){
            if (root!=null){
                return root.afterOrderFind(id);
            }else {
                System.out.println("树为空");
                return null;
            }
        }
    }

  3、顺序存储二叉树

  顺序存储二叉树java二叉树遍历算法,是将二叉树顺序存储到数组中,并在遍历数组的时候依旧按照前序遍历、中序遍历、后序遍历。

  在这里插入图片描述

  顺序存储二叉树的特点:

  从0开始计算【】叶子节点的操作分析与操作策略(上)
,为了与数组索引保持一致。

  代码实现

<p><pre>public class ArrayBinaryTreeDemo {

public static void main(String[] args) {
    int arr[] = {1,2,3,4,5,6,7}; // 这是一个二叉树从根节点依次顺序存储的数组
    ArrayBinaryTree arrayBinaryTree = new ArrayBinaryTree(arr);
    System.out.println("前序遍历:");
    arrayBinaryTree.perOrder();
    System.out.println("\n中序遍历:");
    arrayBinaryTree.infixOrder();
    System.out.println("\n后序遍历:");
    arrayBinaryTree.suffixOrder();
}

}
class ArrayBinaryTree{

int arr[];
public ArrayBinaryTree(int[] arr) {
    this.arr = arr;
}
// 前序遍历顺序存储的二叉树数组
public void perOrder(){
    perOrder(0);
}
public void perOrder(int index){
    System.out.print(arr[index]+" ");
    if ((2*index+1)