簡體   English   中英

在二叉搜索樹中查找父節點

[英]Finding parent node in binary search tree

我得到一個節點的答案為 0。 在打印搜索時,我能夠看到路徑,但是它沒有返回節點的數據。 以下是代碼:

class Node:
    def __init__(self,data):
        self.data=data
        self.left=None
        self.right=None

class BinarySearchTree:
    def __init__(self):
        self.root=None

    def insert(self,ele):
        p=Node(ele)
        if self.root is None:
            self.root=p
            return
        q=self.root
        while(q is not None):
            if ele<=q.data:
                if q.left is None:    
                    q.left=p
                    return
                else:
                    q=q.left
            else:
                if q.right is None:
                    q.right=p
                    return
                else:
                    q=q.right

    def inorder(self,x):
        if x is not None:
            self.inorder(x.left)
            print(x.data,end='-')
            self.inorder(x.right)

    def preorder(self,x):
        if x is not None:
            print(x.data,end='-')
            self.preorder(x.left)
            self.preorder(x.right)

    def postorder(self,x):
        if x is not None:
            self.postorder(x.left)
            self.postorder(x.right)
            print(x.data,end='-')

    def father(self,x,ele):
        if self.root is None:
            return 'Tree Empty'
        x=self.root
        if ele==x.data:
            return 'Root Node'
        while (x is not None):
            if x.left==ele or x.right==ele:
                return x.data
            if ele<=x.data:
                x=x.left
            else:
                x=x.right
        return 0

調用:

b=BinarySearchTree()
b.insert(45)
b.insert(41)
b.insert(79)
b.insert(90)
b.insert(10)
b.insert(88)
b.insert(92)
b.insert(19)
print('--------------------------------------')
print('Inorder Traversal :')
b.inorder(b.root)
print('\n------------------------------------')
print('\nPreorder Traversal :')
b.preorder(b.root)
print('\n------------------------------------')
print('\nPostorder Traversal :')
b.postorder(b.root)
print('\n------------------------------------')
ele=int(input('Enter element to find father of:'))
z=b.father(b.root,ele)
print('Father of '+str(ele)+' is '+str(z))
print('\n------------------------------------')

與元素比較時,我不能寫為x.left.data==ele or x.right.data==ele 有什么建議(考慮插入已正確實施)?

輸出片段是:

--------------------------------------
Inorder Traversal :
10-19-41-45-79-88-90-92-
------------------------------------

Preorder Traversal :
45-41-10-19-79-90-88-92-
------------------------------------

Postorder Traversal :
19-10-41-88-92-90-79-45-
------------------------------------
Enter element to find father of:88
Father of 88 is 0

-----------------------------------

答案應該是 90

    45
   /  \
  41   79
 /      \
10       90
\       / \
 19    88  92

如果我理解正確, ele是您在樹中搜索相應節點的值,因此您無法將其與left節點或right節點進行比較,因為它們的類型不同。 如果這是正確的,那么只需“取消引用”孩子:

def father(self,x,ele):
    if self.root is None:
        return 'Tree Empty'

    x = self.root
    if ele == x.data:
        return 'Root Node'

    while (x is not None):
      node = x.left
      if node.data == ele:
          return x.data
      node = x.right
         return x.data
      if ele <= x.data:
          x = x.left
      else:
          x = x.right

此外,這似乎是通過調試器進行的微不足道的修復。 啟動pdb並在father內部設置一個斷點。 例如:

python -m pdb your_tree_script.py
-> <first executable line of your script output by pdb>
(Pdb) break <line number of first line in father function input by you>
...

請參閱pdb —可用命令的 Python 調試器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM