繁体   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