树形结构:二叉排列树,二叉搜索树

102 篇文章 0 订阅
70 篇文章 0 订阅

二叉排列树,二叉搜索树

这个数听见得比较多,含义是:左边<=中间<=右边,换句话来说使用中序遍历最后得到结果就是一个有序得序列。

建立一颗二叉排列树

class BinTNode:
    def __init__(self,data=None,left =None,right =None):
        self.data =data
        self.left =left
        self.right =right
                
def buildTree(arr,pointer,N):
    # 递归出口,当越界时就没有必要创建节点了直接return,开始回退
    # 当值为-1时,也没有必要创建结点
    if pointer > N or arr[pointer] == -1:
        return None

    curNode = BinTNode(arr[pointer])

    curNode.left = buildTree(arr,2*pointer+1,N)
    curNode.right = buildTree(arr,2*pointer+2,N)
            
    return curNode
    
def inorder(root):
    if not root:
        return
    else:
        inorder(root.left)
        print(root.data,end=' ')
        inorder(root.right)


arr = [6,2,8,0,4,7,9,-1,-1,3,5]
root = buildTree(arr,0,len(arr)-1)
inorder(root)

runfile('D:/share/test/backtracking/Binary_Search_Tree.py', wdir='D:/share/test/backtracking')
0 2 3 4 5 6 7 8 9 

二叉排列树搜索,他可以天然的使用二叉搜索,通过比较要么在左子树,要么在右子树,要么在当前结点

def inorder(root):
    if not root:
        return
    else:
        inorder(root.left)
        print(root.data,end=' ')
        inorder(root.right)
        
def searchInBinaryTree(root,node_key):
    if not root:
        return False
    if root.data == node_key:
        return True
    elif root.data < node_key:
        return searchInBinaryTree(root.right,node_key)    
    else:
        return searchInBinaryTree(root.left,node_key)

二叉树的共同祖先,二叉树的祖先有4种情况,第一种:全部都在一个子树,第二种:每一颗子树一个,第三种:当前结点就是祖先,第四种:就是没有祖先的情况,由于二叉排列树的性质,可以直接区分这四种情况:

class Solution:
    def lowestCommonAncestor(self, root, p, q):
        """
        :type root: TreeNode
        :type p: TreeNode data
        :type q: TreeNode data
        :rtype: TreeNode
        """
        if not root or root.data == p or root.data == q:
            return root
        
        if root.data < p and root.data < q:
            return self.lowestCommonAncestor(root.right, p, q)
        
        elif root.data > p and root.data > q:
            return self.lowestCommonAncestor(root.left, p, q)      
        # 一边一个的情况
        else:
            return root 

# 化简修改后如下 ,这里面实际上假设2个结点都存在
class Solution:
    def lowestCommonAncestor(self, root, p, q):
        """
        :type root: TreeNode
        :type p: TreeNode data
        :type q: TreeNode data
        :rtype: TreeNode
        """       
        if root.data < p and root.data < q:
            return self.lowestCommonAncestor(root.right, p, q)
        
        elif root.data > p and root.data > q:
            return self.lowestCommonAncestor(root.left, p, q)        
        # 实际上这个包含多种请款:
        # not root or root.data == p or root.data == q 和 root.data在p,q之间
        else:
            return root   

    
    # 这里是树形指针的一种用方法,是把递归转化为迭代的一种常用方法
    def lowestCommonAncestorRecursion(self, root, p, q):
        
        pointer = root
        while pointer:
            if pointer.data < p and pointer.data < q:
                pointer = pointer.right
        
            elif pointer.data > p and pointer.data > q:
                pointer = pointer.left        
            else:
                return pointer 

运行结果:

arr = [6,2,8,0,4,7,9,-1,-1,3,5]
root = buildTree(arr,0,len(arr)-1)
inorder(root)
print(searchInBinaryTree(root,9))
t = Solution().lowestCommonAncestorRecursion(root,3,5)
print(t.data if t else t)


runfile('D:/share/test/backtracking/Binary_Search_Tree.py', wdir='D:/share/test/backtracking')
0 2 3 4 5 6 7 8 9 True
4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值