zoukankan      html  css  js  c++  java
  • 平衡二叉树

    平衡二叉树

    public class BinaryTree {
    
        public Node root;
        
    
        /**
         * 内部类实现结点类,可提高安全性
         * 
         */
        static class Node{
            int data;
            Node left;
            Node right;
            Node(int newData){
                left = null;
                right = null;
                data = newData;
            }
        }
    
    
        /**
         * 创建一个空的二叉树
         */
    
        public BinaryTree() {
            root = null;
        }
        
        /**
         * 递归的插入数值
         * @param data    要插入的数值
         */
    
        public void insert(int data) {
            root = insert(root,data);
        }
        
        /**
         * 将数值插入到二叉树中,比当前结点小或等于当前结点的插在当前结点的左侧,比当前结点大的数插在当前结点的右侧,每次从根结点开始递归比较
         * @param node    当前的结点,就是根结点,只是每次根结点的左右子孙更新
         * @param data    要插入的数值
         * @return    新排好的二叉树
         */
    
        private Node insert(Node node, int data) {
            if(node == null){
                node = new Node(data);
            }else{
                if(data <= node.data){
                    node.left = insert(node.left,data);
                }else{
                    node.right = insert(node.right,data);
                }
            }
            
            return node;
        }
        
        /**
         * 将数值输入构建二叉树
         * @param data    要输入的数值
         */
    
        public void buildTree(int[] data) {
            for(int i=0; i<data.length; i++){
                insert(data[i]);
            }
    
        }
        
        /**
         * 递归打印出二叉树
         */
    
        public void printTree() {
            printTree(root);
            System.out.println();
        }
        
        /**
         * 从根结点开始遍历,从树的最高层叶子结点开始输出,从左至右
         * @param node    当前的结点
         */
    
        private void printTree(Node node) {
            if(node == null){
                return;
            }else{
                printTree(node.left);
                System.out.print(node.data+"  ");
                printTree(node.right);
            }
            
        }
    
    }

    对递归的理解:

      root = insert(root,data);

    这行代码和
    private Node insert(Node node, int data) {
            if(node == null){
                node = new Node(data);
            }else{
                if(data <= node.data){
                    node.left = insert(node.left,data);
                }else{
                    node.right = insert(node.right,data);
                }
            }
            
            return node;
        }
    上面的函数确定了根节点一定是第一个输出的节点,且不论后面如何调用根节点始终保持不变,函数返回值和传入参数相等,传入根节点,返回一定也是根节点。
    每次增加虽然总是返回根节点,但递归加深了叶子节点数,让更多的节点间接和根节点产生关联。因为随着递归的不断递进,肯定会出现 node==null,这时就
    会新建节点,节点链接在相应位置上。

    下面再分析打印程序:
    打印程序也是递归结构的,递归的打印肯定类似逆序打印。上面的程序其实就是中序遍历。

    测试用例:

    import junit.framework.TestCase;
    
    public class BinaryTreeTest extends TestCase {
    
        public void testBinaryTreeTest() {
    
            BinaryTree biTree = new BinaryTree();
    
            int[] data = {100,2,103, 8, 7,23};
    
            biTree.buildTree(data);
    
            biTree.printTree();
            System.out.println(biTree.root.data);
            System.out.println(biTree.root.left.data);
            System.out.println(biTree.root.left.right.data);
            System.out.println(biTree.root.left.right.left.data);
            System.out.println(biTree.root.left.right.right.data);
            
            System.out.println(biTree.root.right.data);
        }
    
    }

    结果输出:

    2  7  8  23  100  103  
    100
    2
    8
    7
    23
    103

    构建的平衡二叉树为:

                    100        
    //          /        
    //         2          103
    //       /        
    //            8
                 /    
                7   23    
  • 相关阅读:
    Struts2中validate数据校验的两种常用方法
    Oracle中主键、外键、索引、序列、唯一性约束的创建
    Hibernate学习(五)Hibernate 多对多映射
    oracle实现主键自增
    现代软件工程 第三章:【软件工程师的成长】练习与讨论
    现代软件工程 第十七章 【人、绩效和职业道德】 练习与讨论
    现代软件工程 第十章 【典型用户和场景】 练习与讨论
    现代软件工程 第八章 【需求分析】练习与讨论
    现代软件工程 第七章 【MSF】练习与讨论
    现代软件工程 第六章 【敏捷流程】练习与讨论
  • 原文地址:https://www.cnblogs.com/hixin/p/4744704.html
Copyright © 2011-2022 走看看