树形结构:二叉排列树,二叉搜索树
生活随笔
收集整理的這篇文章主要介紹了
树形结构:二叉排列树,二叉搜索树
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
二叉排列樹(shù),二叉搜索樹(shù)
這個(gè)數(shù)聽(tīng)見(jiàn)得比較多,含義是:左邊<=中間<=右邊,換句話來(lái)說(shuō)使用中序遍歷最后得到結(jié)果就是一個(gè)有序得序列。
建立一顆二叉排列樹(shù)
class BinTNode:def __init__(self,data=None,left =None,right =None):self.data =dataself.left =leftself.right =rightdef buildTree(arr,pointer,N):# 遞歸出口,當(dāng)越界時(shí)就沒(méi)有必要?jiǎng)?chuàng)建節(jié)點(diǎn)了直接return,開(kāi)始回退# 當(dāng)值為-1時(shí),也沒(méi)有必要?jiǎng)?chuàng)建結(jié)點(diǎn)if pointer > N or arr[pointer] == -1:return NonecurNode = BinTNode(arr[pointer])curNode.left = buildTree(arr,2*pointer+1,N)curNode.right = buildTree(arr,2*pointer+2,N)return curNodedef inorder(root):if not root:returnelse: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二叉排列樹(shù)搜索,他可以天然的使用二叉搜索,通過(guò)比較要么在左子樹(shù),要么在右子樹(shù),要么在當(dāng)前結(jié)點(diǎn)
def inorder(root):if not root:returnelse:inorder(root.left)print(root.data,end=' ')inorder(root.right)def searchInBinaryTree(root,node_key):if not root:return Falseif root.data == node_key:return Trueelif root.data < node_key:return searchInBinaryTree(root.right,node_key) else:return searchInBinaryTree(root.left,node_key)二叉樹(shù)的共同祖先,二叉樹(shù)的祖先有4種情況,第一種:全部都在一個(gè)子樹(shù),第二種:每一顆子樹(shù)一個(gè),第三種:當(dāng)前結(jié)點(diǎn)就是祖先,第四種:就是沒(méi)有祖先的情況,由于二叉排列樹(shù)的性質(zhì),可以直接區(qū)分這四種情況:
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 rootif 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) # 一邊一個(gè)的情況else:return root # 化簡(jiǎn)修改后如下 ,這里面實(shí)際上假設(shè)2個(gè)結(jié)點(diǎn)都存在 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) # 實(shí)際上這個(gè)包含多種請(qǐng)款:# not root or root.data == p or root.data == q 和 root.data在p,q之間else:return root # 這里是樹(shù)形指針的一種用方法,是把遞歸轉(zhuǎn)化為迭代的一種常用方法def lowestCommonAncestorRecursion(self, root, p, q):pointer = rootwhile pointer:if pointer.data < p and pointer.data < q:pointer = pointer.rightelif pointer.data > p and pointer.data > q:pointer = pointer.left else:return pointer運(yùn)行結(jié)果:
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總結(jié)
以上是生活随笔為你收集整理的树形结构:二叉排列树,二叉搜索树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 树形结构:寻找共同祖先
- 下一篇: 树形结构:从二分查找,二叉搜索树寻找最近