普通二叉树操作

Posted linchongatfirst

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了普通二叉树操作相关的知识,希望对你有一定的参考价值。

  所谓普通二叉树,也就是排序二叉树,对于任何一个节点,它的左子树比自己大,右子树比自己小,不保证平衡因子的范围,其实这是最基础的二叉树,你也可以

增加他的搜索方法,就成了搜索二叉树。常见操作有构建排序二叉树、获取最大值、最小值、获取所有叶子节点、层级遍历、前序遍历、后序遍历、中序遍历、添加对象数组、添加元素、统计、叶子节点个数删除元素、插入、翻转、判断是不是二叉搜索树、求深度、判空等。

package NewTree;

import java.time.format.ResolverStyle;
import java.util.LinkedList;
import java.util.Queue;

import javax.print.attribute.standard.NumberOfDocuments;

public class Tree {
    Node<Integer> root;
    
    public Tree(int[] t) throws Exception {
        for(int i=0;i<t.length;i++) {
            add(t[i]);
        }
    }
    public Tree() {    }
    public boolean search(Node<Integer> node,int c) {
        if(c==node.data) {
            return true;
        }else if(c>node.data) {
            search(node.right, c);
        }else {
            search(node.left, c);
        }
        return false;
    }
//    统计叶子节点的个数
    public  int leafNum(Node node) {
        if (node != null) {
            if (node.left == null && node.right == null) {
                return 1;
            }
            return leafNum(node.left) + leafNum(node.right);
        }
        return 0;
    }

    
    public void add(int t) throws Exception {
        Node<Integer> current = root;
        Node<Integer> node = new Node<Integer>(t);
        if(current==null) {
            root = new Node<>(t);
            return ;
        }
        while(current!=null) {
            if(current.data>t) {
                if(current.left==null) {
                    current.left = node;
                   return ;
                }
                else {
                    current = current.left;
                }
            }else if(current.data<t){
                if(current.right==null)
                {
                    current.right = node;
                return ;
                }
                else {
                    current = current.right;
                }
            }else {
                throw new Exception("不允许出现相同的元素");
            }
        }
        
    }
    public int getmax() {
        return getmax(root);
    }
    public int  getmax(Node<Integer> node) {
        if(node.right==null) {
            return node.data;
        }
        return  getmax(node.right);
    }
    
    public void insert(int t) {
        root = insert(root,t);
    }
    public Node<Integer> insert(Node<Integer> node,int t) {
        if(node==null) {
            return new Node<Integer>(t);
        }if(t<node.data) {
            node.right = insert(node.right, t);
        }else if(t>node.data) {
            node.left = insert(node.left, t);
        }
        return node;
    }
    public boolean isEmpey() {
        return root == null;
    }
//    中序遍历
    public void inorder(Node<Integer> node) {
        if(node!=null) {
            inorder(node.left);
            System.out.println(node.data);
            inorder(node.right);
        }
    }

    public void beforeorder(Node<Integer> node) {
        if(node!=null) {
            System.out.println(node.data);
            beforeorder(node.left);
            beforeorder(node.right);
        }
    }
//    后序遍历
    public void behindeorder(Node<Integer> node) {
        if(node!=null) {
            behindeorder(node.left);
            behindeorder(node.right);
            System.out.println(node.data);
        }
    }
    public void reverse(Node<Integer> node) {
        if(node==null) {
            return;
        }
        Node<Integer> current ;
        current  = node.left;
        node.left = node.right;
        node.right = current;
        reverse(node.left);
        reverse(node.right);
    }
//    求二叉树的深度
    public static int getDepthRec(Node root) {
           if (root == null) {
               return 0;
           }
           return Math.max(getDepthRec(root.left), getDepthRec(root.right)) + 1;
        }
//    判断是不是二叉搜索树
    public static boolean isValidBST(Node<Integer> root, int pre){
        if (root == null) {
            return true;
        }
        boolean left = isValidBST(root.left, pre);
        if (!left) {
            return false;
        }
        if(root.data <= pre) {
            return false;
        }
        pre = root.data;
        boolean right = isValidBST(root.right, pre);
        if(!right) {
            return false;
        }
        return true;
    }
    public static void main(String[] args) throws Exception {
        int[] a = new int[]{18,4,5,3,90,9,56};
         Tree tree=  new Tree(a);
         System.out.println("输出叶子节点的个数:"+tree.leafNum(tree.root));
         System.out.println("输出二叉树的深度:"+tree.leafNum(tree.root));
         System.out.println("最大值: "+tree.getmax());
//         System.out.println("中序遍历");
//        tree.inorder(tree.root);
//        System.out.println("前序遍历");
//        tree.beforeorder(tree.root);
//        System.out.println("后序遍历");
//        tree.behindeorder(tree.root);
//        System.out.println("中序遍历翻转后的二叉树");
//        tree.reverse(tree.root);
//       tree.inorder(tree.root);
       System.out.println("是平衡树吗:"+tree.isValidBST(tree.root, tree.root.left.data));
       
       System.out.println("层序遍历:");
       Queue<Node<Integer>> queue = new LinkedList<>();
       queue.add(tree.root);
       while(!queue.isEmpty()) {
           Node<Integer> temp = queue.poll();
           System.out.printf(temp.data + "  ");
           if(temp.left!=null) {
               queue.add(temp.left);
           }
           if(temp.right!=null) {
               queue.add(temp.right);
           }
       }
    }
    
}

    今天先立个flag,下一篇,再写个平衡树的API,全面探究下平衡树的操作。

以上是关于普通二叉树操作的主要内容,如果未能解决你的问题,请参考以下文章

森林转化为二叉树(详解版)

数据结构——平衡二叉树(AVL树)

如何删除一棵普通二叉树的叶子结点?

数据结构(12)---二叉树之顺序结构

平衡二叉树插入操作的详细过程图解

二叉树寻找前驱的普通方法和线索二叉树对比