Convert BST to Greater Tree

来源:互联网 发布:sql增删改查面试题 编辑:程序博客网 时间:2024/06/05 08:22
1.Binary Search Tree:也称二叉搜索树、二叉查找树、有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree),是指一棵空树或者具有下列性质的二叉树:
若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
任意节点的左、右子树也分别为二叉查找树;
没有键值相等的节点。
2.题意:给定一个搜索树,每一个键值变为原来键值与比它大的键值相加的和,并没有说明需要是有线连接的键值。
思路:首先用一种合适的存储方式,然后遍历树,比较大小,用一个变量sum来记录比它大的同时相加。
题目里给出了二叉树节点的定义,其中包含了左孩子和右孩子的信息。这就是我所说的存储方式,这样的说法可能不准确
class TreeNode(object):
     def __init__(self, x):
         self.val = x
         self.left = None
         self.right = None
接下来是要遍历树
3.有个问题:既然是搜索树,就说明左孩子一定比根节点小,右孩子一定比根节点大,
那根节点就一定会变成右孩子和根节点的和,
而左孩子一定比根节点和右孩子都小,也就是左孩子一定会变成根节点和左右孩子的和,而右孩子一定不变。

那就不用比较大小了????

回答:这样是没错的,直接找最右边的叶节点赋值给sum,保持此节点值不变,然后其根节点变为原值+sum,更新sum,然后左节点变为原值+sum,更新sum,按照这个规则就可以把所有节点给赋值。

4.不清楚应该返回什么?对这个二叉树节点的定义不是很明白···

回答:定义一棵二叉树,三个点,然后再用左节点定义二叉树,右节点也定义一棵二叉树,如此便生成了一棵包含很多节点的树。返回root就是返回整棵树咯。

5.返回三个节点的值?初始化中左右孩子都是None ?
回答:初始化的时候肯定是None,因为左右孩子要做为根节点初始化的时候才会赋值。

6.error:TreeNode是一种类型 不能像int一样进行相加的运算

回答:root.val以及root.left.val才是值,可以进行相加。

7.self究竟是什么意思?继承?方法?对象?
代表类的实例 对象自己

回答:

http://python.jobbole.com/81921/

https://sjolzy.cn/Why-should-self-Python.html

https://stackoverflow.com/questions/2709821/what-is-the-purpose-of-self
廖雪峰 类和实例
多态:既是子类也是父类
属性?self.name  name 就是属性
8.终于弄明白:
class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

root=TreeNode(5)   因为 __init__前后两个下划线的命名方法表示这是个特殊方法,需要把参数带上
print(root.val,root.left,root.right)
9.其实这个算法是做了一次树的遍历  ‘’右根左‘’的规则
  class Solution(object):
    def convertBST(self, root):
        self.val = 0
        def visit(root):这里为啥不需要self了?因为self是类的实例,这个方法的定义在convertBST里面了,convertBST的定义中第一个参数是self
            if root:
                visit(root.right)
                root.val += self.val
                self.val = root.val
                visit(root.left)
        visit(root)
        return root
注:这里的self.val就是我所说的算法里的sum

10.还未想通的这个程序

def convertBST(self, root):
    def reverse(root):
        return reverse(root.right) + [root] + reverse(root.left) if root else []
    for a, b in zip(reverse(root), reverse(root)[1:]):
        b.val += a.val
    return root
时隔一周,继续思考~上周太忙啦!
print([1,2]+[3,4])  结果是[1,2,3,4]

有没有热情的小伙伴可以给解释一下~?

原创粉丝点击