1028. 从先序遍历还原二叉树 正则表达式

1028. 从先序遍历还原二叉树

一般来说仅 中序遍历 是无法还原二叉树的,但是这个字符串里带有深度信息。
所以可以先用正则表达式把值及其深度提取出来,然后重建二叉树。
例如当前节点深度为i,那么下下个深度为i+1的节点就是右字数的首节点。

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func recoverFromPreorder(S string) *TreeNode {
	nodeReg,_:=regexp.Compile("[-]*[0-9]+")
	nodes:=nodeReg.FindAllStringSubmatch(S,-1)
	numReg,_:=regexp.Compile("[0-9]+")
	nodez:=[][2]int{}
	for _,node:=range nodes{
		num:=numReg.FindString(node[0])
		val,_:=strconv.Atoi(num)
		nodez = append(nodez, [2]int{val, len(node[0])- len(num)})
	}
	return recoverFromPreorderNodes(nodez)
}

func recoverFromPreorderNodes(nodes [][2]int) *TreeNode {
	root:=&TreeNode{Val: nodes[0][0]}
    if len(nodes)==1{
		return root
	}
	i:=1	//右子树起点
	flag:=true
	for ;i< len(nodes);i++{
		if nodes[i][1]==nodes[0][1]+1{
			if flag{
				flag=false
			}else{
				break
			}
		}
	}
	root.Left=recoverFromPreorderNodes(nodes[1:i])
	if i< len(nodes){
		root.Right=recoverFromPreorderNodes(nodes[i:])
	}
	return root
}

你可能感兴趣的:(算法)