把二叉搜索树转换为累加树
1.解法
思路:一看到二叉搜索树,就想到中序遍历,因为中序遍历二叉搜索树会得到一个升序序列。所以我们先进行中序遍历,然后发现我们只要对这个升序序列从最后一个值开始,依次向前累加,得到的值就是改变后的累加树中每个节点的值,例如:题目中给的例子:[0,1,2,3,4,5,6,7,8],从8开始向前累加,最后一个元素还是8,然后倒数第二个元素变为15(7+8),以此类推,得到一个变换后的序列[36,36,35,33,30,26,21,15,8],再把这些数字按照中序遍历赋给原二叉搜索树中的每个节点即可。
代码如下:
def convertBST(root):
result = [] # 存放升序序列
# 第一次中序遍历:获得升序序列
def traversal1(root):
if not root:
return
traversal1(root.left)
result.append(root.val)
traversal1(root.right)
traversal1(root)
# 累加
sum = 0
for i in range(len(result)-1,-1,-1):
sum += result[i]
result[i] = sum
# 第二次升序遍历:赋值
def traversal2(root):
if not root:
return
traversal2(root.left)
value = result.pop(0)
root.val = value
traversal2(root.right)
traversal2(root)
return root
上述代码中我们用了两次中序遍历,有没有办法可以在一次中序遍历的操作中把累加和赋值都做了呢?我们可以采用右中左的反中序遍历的方法,从二叉搜索树的最右边(也就是升序序列的最后面)向最左边(也就是升序序列的最前面)进行累加和赋值。
代码如下:
def convertBST(root):
pre = 0
def traversal(root):
nonlocal pre
if not root:
return
traversal(root.right)
root.val += pre
pre = root.val
traversal(root.left)
traversal(root)
return root
2.总结
算法
二叉搜索树–中序遍历,这两个密不可分