1028. 从先序遍历还原二叉树
我们从二叉树的根节点 root
开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D
条短划线(其中 D
是该节点的深度),然后输出该节点的值。(如果节点的深度为 D
,则其直接子节点的深度为 D + 1
。根节点的深度为 0
)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S
,还原树并返回其根节点 root
。
示例 1:
输入:"1-2--3--4-5--6--7"
输出:[1,2,5,3,4,6,7]
示例 2:
输入:"1-2--3---4-5--6---7"
输出:[1,2,5,3,null,6,null,4,null,7]
示例 3:
输入:"1-401--349---90--88"
输出:[1,401,null,349,88,90]
提示:
- 原始树中的节点数介于
1
和1000
之间。 - 每个节点的值介于
1
和10 ^ 9
之间。
这题真是难为我了。看到题的瞬间想的是递归实现,琢磨了一上午,写错了N版代码,递归也没能实现。我还是太菜了。最后想了想,感觉用栈应该可以。大概思路就是用栈保存当前节点所有的祖先,如果当前节点的层数大于(等于)栈的长度,证明当前节点可以成为栈顶节点的孩子。否则的话,就不断的出栈操作,直到当前节点的层数大于(等于)栈的长度。插入的时候再判断一下栈顶节点有没有左孩子,没有就成为左孩子,有就成为右孩子,并把这个节点入栈。代码如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def recoverFromPreorder(self, S):
x = 0
#字符串处理
s = ""
while x<len(S) and S[x]!='-':
s = s + S[x]
x = x + 1
ans = TreeNode(s) #存储最后答案
stack = [] #栈
stack.append(ans)
flag = 0 #当前节点的层次
while x < len(S):
if S[x]=='-': #统计下一个节点的层次(‘-’的数量)
flag = flag + 1
x = x + 1
else:
s = ""
while x<len(S) and S[x]!='-':
s = s + S[x]
x = x + 1
item = TreeNode(s)
while flag < len(stack):
stack.pop() #不断出栈
if(stack[-1].left == None):
stack[-1].left = item
else:
stack[-1].right = item
flag = 0#层数标记初始化
stack.append(item)#当前节点入栈
return ans
注意处理字符串,并不是整型变量。开始忘记处理,越界了N多次,最后才发现····
代码写的粗糙了点,不过至少能过,整了一上午。很欣慰了·····