N叉树与二叉树的相互转换

N叉树与二叉树的相互转换

题目描述

将一颗N叉树转换成一颗二叉树,将一棵二叉树树还原成一棵N叉树

题目分析

N叉树转换成二叉树,可以将N叉树的子树全看成二叉树的左节点的右节点。每颗子树也是如此。

代码

public class EncodeNaryTreeToBinaryTree {

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

        public Node() {
        }

        public Node(int _val) {
            val = _val;
        }

        public Node(int _val, List<Node> _children) {
            val = _val;
            children = _children;
        }
    };

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

        TreeNode(int x) {
            val = x;
        }
    }
    class Codec {
        // Encodes an n-ary tree to a binary tree.
        public TreeNode encode(Node root) {
           if(root ==null){
               return null;
           }
           TreeNode treeNode = new TreeNode(root.val);
           treeNode.left = en(root.children);
           return treeNode;
        }

        private TreeNode en(List<Node> root) {
            TreeNode head = null;
            TreeNode cur = null;
            for (Node t: root) {
                TreeNode tNode = new TreeNode(t.val);
                if(head==null){
                    head = tNode;
                }else{
                    cur.right = tNode;
                }
                cur= tNode;
                cur.left = en(t.children);
            }
            return head;
        }

        // Decodes your binary tree to an n-ary tree.
        public Node decode(TreeNode root) {
            if(root ==null){
                return null;
            }
            return new Node(root.val,de(root.left));
        }

        private List<Node> de(TreeNode root) {
            List<Node> childs=new ArrayList<>();
            while(root!=null){
                Node node =new Node(root.val,de(root.left));
                childs.add(node);
                root = root.right;
            }
            return childs;
        }
    }
}

小结

  1. 这里编码涉及到的递归都是半递归,左子树用递归得到,右子树用迭代。
  2. 分析好递归的起始点,并不是整棵树进来就是递归,而是在建子树和左子树的时候进行递归。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值