关于二叉树的镜像问题:
思路是这样的:从根结点出发,先交换它的左节点和右节点,然后对左子树作镜像,再对右子树作镜像。代码如下:
def Mirror(root):
if not root:
return
root.left,root.right=root.right,root.left
Mirror(root.left)
Mirror(root.right)
关于寻找两个节点p和q的公共最低祖先问题:
思路如下:先进行遍历,将(节点:父节点)的值放入字典中,然后针对p,建立一个它的所有祖先的集合,然后判断q的祖先在不在这个集合中,在的话就输出q,代码如下:
def LowestParent(root,p,q):
stack=[root]
par_child={root:None}
while stack:
node=stack.pop()
if node.left:
par_child[node.left]=node
stack.append(node.left)
if node.right:
par_child[node.right]=node
stack.append(node.right)
res=set()
while p:
res.add(p)
p=par_child[p]
while q not in res:
q=par_child[q]
return q
二叉查找树的搜索问题:
本质是遍历该树找到某个值,由于二叉查找树的特性,即左节点的值<根结点的值<右节点的值,故遍历更为简单,代码如下:
def Search(root,parent,data):
if not root:
return False,root,parent
if root.val==data:
return True,root,parent
if root.val<data:
return Search(root.right,root,data)
if root.val>data:
return Search(root.left,root,data)
二叉查找树的插入问题:
思想是这样的:利用二叉查找树的搜索来锁定最后一个查找的位置,如果要插入的值大于该位置的值,则插入该节点为右节点,否则插入为左节点。
def Insert(data):
flag,n,p=Search(root,root,data)
if flag==False:
new_Node=TreeNode(data)
if data>p.val:
p.right=new_Node
if data<p.val:
p.left=new_Node