友谊地久天长 2019-12-07 14:14 采纳率: 0%
浏览 246
已结题

数据结构求问:想用层次遍历序列构造二叉树,但是下面的代码运行之后只能构造一层,具体应该怎么改?

图片说明

  • 写回答

1条回答 默认 最新

  • 太阳伞下的阿呆 2019-12-09 17:06
    关注

    可以参考这个AVL树的实现,遍历序列insert node即可

    public class AvlNode<T> {
    
        private T data;
        private Integer height;
        private AvlNode<T> left;
        private AvlNode<T> right;
        private AvlNode<T> parent;
    
        public AvlNode(T data) {
            this(data, null, null);
        }
    
        public AvlNode(T data, AvlNode left, AvlNode right) {
            this.height = 0;
            this.data = data;
            this.left = left;
            this.right = right;
        }
    
        public T getData() {
            return data;
        }
    
        public void setData(T data) {
            this.data = data;
        }
    
        public Integer getHeight() {
            return height;
        }
    
        public void setHeight(Integer height) {
            this.height = height;
        }
    
        public AvlNode<T> getLeft() {
            return left;
        }
    
        public void setLeft(AvlNode<T> left) {
            this.left = left;
        }
    
        public AvlNode<T> getRight() {
            return right;
        }
    
        public void setRight(AvlNode<T> right) {
            this.right = right;
        }
    
        public AvlNode<T> getParent() {
            return parent;
        }
    
        public void setParent(AvlNode<T> parent) {
            this.parent = parent;
        }
    
        @Override
        public String toString() {
            return "AvlNode{" + "height=" + height + ", data=" + data + '}';
        }
    }
    import lombok.Data;
    @Data
    public class SimpleAvlTree {
    
        public static AvlNode<Integer> insert(Integer data, AvlNode<Integer> node) {
            if (node == null) {
                return new AvlNode<Integer>(data);
            }
            int compareResult = compare(data, node.getData());
            if (compareResult < 0) {
                node.setLeft(insert(data, node.getLeft()));
                if (height(node.getLeft()) - height(node.getRight()) == 2 ) {
                    if (compare(data, node.getLeft().getData()) < 0) {
                        node = rotateWithLeftChild(node);
                    } else {
                        node = doubleWithLeftChild(node);
                    }
                }
            } else if (compareResult > 0) {
                node.setRight(insert(data, node.getRight()));
                if (height(node.getRight()) - height(node.getLeft()) == 2 ) {
                    if (compare(data, node.getRight().getData()) > 0) {
                        node = rotateWithRightChild(node);
                    } else {
                        node = doubleWithRightChild(node);
                    }
                }
            }
            node.setHeight(Math.max(height(node.getLeft()), height(node.getRight())) + 1);
            return node;
        }
    
        /**
         * 根据左子节点右旋
         * @param k2 : 
         * @return org.gallant.tree.avl.AvlNode<java.lang.Integer> : 
         */
        public static AvlNode<Integer> rotateWithLeftChild(AvlNode<Integer> k2){
            AvlNode<Integer> k1 = k2.getLeft();
            k2.setLeft(k1.getRight());
            k1.setRight(k2);
            k2.setHeight(Math.max(height(k2.getLeft()), height(k2.getRight())) + 1);
            k1.setHeight(Math.max(height(k1.getLeft()), k2.getHeight()) + 1);
            return k1;
        }
        /**
         * 根据右子节点左旋
         * @param k2 : 
         * @return org.gallant.tree.avl.AvlNode<java.lang.Integer> : 
         */
        public static AvlNode<Integer> rotateWithRightChild(AvlNode<Integer> k2){
            AvlNode<Integer> k1 = k2.getRight();
            k2.setRight(k1.getLeft());
            k1.setLeft(k2);
            k2.setHeight(Math.max(height(k2.getRight()), height(k2.getLeft())) + 1);
            k1.setHeight(Math.max(height(k1.getRight()), k2.getHeight()) + 1);
            return k1;
        }
        /**
         * 先左旋再右旋
         * @param k3 : 
         * @return org.gallant.tree.avl.AvlNode<java.lang.Integer> : 
         */
        public static AvlNode<Integer> doubleWithLeftChild(AvlNode<Integer> k3){
            k3 = rotateWithRightChild(k3.getLeft());
            return rotateWithLeftChild(k3);
        }
        /**
         * 先右旋再左旋
         * @param k3 : 
         * @return org.gallant.tree.avl.AvlNode<java.lang.Integer> : 
         */
        public static AvlNode<Integer> doubleWithRightChild(AvlNode<Integer> k3){
            k3 = rotateWithLeftChild(k3.getRight());
            return rotateWithRightChild(k3);
        }
    
        /**
         * 比较两个节点的大小
         * @param data1 :
         * @param data2 :
         * @return java.lang.Integer :
         */
        public static Integer compare(Integer data1, Integer data2) {
            return data1 - data2;
        }
        /**
         * 获取节点高度,如果为空则为-1
         * @param node :
         * @return java.lang.Integer :
         */
        public static Integer height(AvlNode<Integer> node) {
            return node == null ? -1 : node.getHeight();
        }
    
        public static AvlNode<Integer> test(){
            AvlNode<Integer> node = SimpleAvlTree.insert(20, null);
            node = SimpleAvlTree.insert(25, node);
            node = SimpleAvlTree.insert(15, node);
            node = SimpleAvlTree.insert(18, node);
            node = SimpleAvlTree.insert(10, node);
            node = SimpleAvlTree.insert(13, node);
            return node;
        }
    
        public static AvlNode<Integer> test2(){
            AvlNode<Integer> node = SimpleAvlTree.insert(20, null);
            node = SimpleAvlTree.insert(25, node);
            node = SimpleAvlTree.insert(15, node);
            node = SimpleAvlTree.insert(18, node);
            node = SimpleAvlTree.insert(16, node);
            return node;
        }
    
        public static AvlNode<Integer> test3(){
            AvlNode<Integer> node = SimpleAvlTree.insert(20, null);
            node = SimpleAvlTree.insert(25, node);
            node = SimpleAvlTree.insert(30, node);
            return node;
        }
    
        public static void main(String[] args) {
            AvlNode<Integer> node = test();
            System.out.println(node);
            fillParent(node);
            print(node, 0, 25);
        }
    
        /**
         * 打印目标节点的路径
         * @param node : 
         * @param summary :
         * @param aim :
         */
        public static void print(AvlNode<Integer> node, Integer summary, Integer aim){
            if (node == null) {
                return;
            }
            summary += node.getData();
            if (summary.equals(aim)) {
                System.out.println(summary);
                printPath(node);
                return;
            }
            print(node.getLeft(), summary, aim);
            print(node.getRight(), summary, aim);
        }
    
        /**
         * 打印当前节点至root节点路径
         * @param node :
         */
        public static void printPath(AvlNode<Integer> node) {
            if (node.getParent() != null) {
                printPath(node.getParent());
            }
            System.out.print(node.getData()+",");
        }
    
        /**
         * 填充指向父的指针
         * @param node :
         */
        public static void fillParent(AvlNode<Integer> node) {
            if (node == null) {
                return;
            }
            if (node.getLeft() != null) {
                node.getLeft().setParent(node);
            }
            if (node.getRight() != null) {
                node.getRight().setParent(node);
            }
            fillParent(node.getLeft());
            fillParent(node.getRight());
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于#flink#的问题:关于docker部署flink集成hadoop的yarn,请教个问题flink启动yarn-session.sh连不上hadoop
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题