日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/9/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树形结构:二叉排列树,二叉搜索树 小編覺(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。