二叉树 — 多叉转二叉树

题目:
将一棵多叉树,转换成二叉树,在通过这个二叉树还原成多叉树。

分析
毫无疑问,多叉树的头结点也是转换的二叉树的头结点。
多叉树如下图所示:
在这里插入图片描述
转换成二叉树,则将多叉树所有的节点X,将X的孩子全部放在X的左侧节点的右边界上。转换过后的二叉树如下图所示:
在这里插入图片描述
右树完全为null,这样既方便了转化,有方便了复原。

代码
多叉树结构如Node,子节点为List< Node >,encode()方法转换成二叉树时,采用深层优先遍历的方式,优先构建最底层子节点,还原时同样如此,采用深层优先遍历,优先还原子节点。

public static class Node{
        int val;
        List<Node> childNode;

        public Node(int val){
            this.val = val;
        }

        public Node(int val,List<Node> childNode){
            this.val = val;
            this.childNode = childNode;
        }
    }

    public static class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;

        public TreeNode(int val){
            this.val = val;
        }
    }


    public static TreeNode encode(Node root){
        if (root == null){
            return null;
        }
        TreeNode head = new TreeNode(root.val);
        head.left = en(root.childNode);
        return null;
    }

    public static TreeNode en(List<Node> childNode){
        TreeNode head = null;
        TreeNode cur = null;
        for (Node child : childNode){
            TreeNode tNode = new TreeNode(child.val);
            if (head == null){
                head = tNode;
            }else{
                cur.right = tNode;
            }
            cur = tNode;
            cur.left = en(child.childNode);

        }
       return head;
    }

    public static Node decode(TreeNode root){
        if (root == null){
            return null;
        }
        Node head = new Node(root.val);

        return null;
    }

    public static List<Node> de(TreeNode node){
        List<Node> childNode = new ArrayList<>();
        while (node != null){
            Node cur = new Node(node.val,de(node.left));
            childNode.add(cur);
            node = node.right;
        }
       return childNode;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值