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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2024/9/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树形结构:二叉排列树,二叉搜索树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

二叉排列樹,二叉搜索樹

這個數(shù)聽見得比較多,含義是:左邊<=中間<=右邊,換句話來說使用中序遍歷最后得到結果就是一個有序得序列。

建立一顆二叉排列樹

class BinTNode:def __init__(self,data=None,left =None,right =None):self.data =dataself.left =leftself.right =rightdef buildTree(arr,pointer,N):# 遞歸出口,當越界時就沒有必要創(chuàng)建節(jié)點了直接return,開始回退# 當值為-1時,也沒有必要創(chuàng)建結點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

二叉排列樹搜索,他可以天然的使用二叉搜索,通過比較要么在左子樹,要么在右子樹,要么在當前結點

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)

二叉樹的共同祖先,二叉樹的祖先有4種情況,第一種:全部都在一個子樹,第二種:每一顆子樹一個,第三種:當前結點就是祖先,第四種:就是沒有祖先的情況,由于二叉排列樹的性質,可以直接區(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) # 一邊一個的情況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 = 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

運行結果:

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

總結

以上是生活随笔為你收集整理的树形结构:二叉排列树,二叉搜索树的全部內容,希望文章能夠幫你解決所遇到的問題。

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