思路简述
一道困难题,是一道偏设计类的题目,首先第一个困难点就是如何用二叉树来表示一颗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
}