Leetcode431.将N叉树编码为二叉树(golang)

思路简述

一道困难题,是一道偏设计类的题目,首先第一个困难点就是如何用二叉树来表示一颗N叉树,其中一种可行常见的思想是:二叉树中节点的左子树为原N叉树中的孩子,右子树为原N叉树中的兄弟节点,下面是一个小例子:

有了这样的转换方式作为前提,剩下的就是代码,问题就在于这里需要递归地编码与解码,其实也是比较抽象的,在写递归函数的时候要分层的来考虑,适用于该层的处理就在函数内完成,下一层的处理就丢给递归,这样才不容易乱。

代码实现

这里用Golang语言来描述

/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Children []*Node
 * }
 */

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

type Codec struct {
    
}

func Constructor() *Codec {
    return &Codec{}
}

// 将N叉树编码为二叉树
func (this *Codec) encode(root *Node) *TreeNode {
    if root == nil{
        return nil
    }
    head := &TreeNode{
        Val: root.Val,
        Left: en(root.Children),
    }
    return head
}

func en(children []*Node) *TreeNode{
    var head *TreeNode = nil
    var cur *TreeNode = nil
    for _, child := range children{
        newNode := &TreeNode{
            Val: child.Val,
            Left: en(child.Children),
        }
        if head == nil{
            head = newNode
        }else{
            cur.Right = newNode
        }
        cur = newNode
    }
    return head
}

func (this *Codec) decode(root *TreeNode) *Node {
    if root == nil{
        return nil
    }
    head := &Node{
        Val: root.Val,
        Children: de(root.Left),
    }
    return head
}

func de(root *TreeNode) []*Node{
    children := []*Node{}
    for root != nil{
        newNode := &Node{
            Val: root.Val,
            Children: de(root.Left),
        }
        children = append(children, newNode)
        root = root.Right
    }

    return children
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值