+9 投票
分类:学习问题 | 用户: 10 10 9 (8.6k 分)
修改于 用户:

二叉树在添加新节点的时候,需要输入两个参数:父节点的位置和节点储存的元素。

但是要建立一个如图所示的二叉树实例时,除了根节点的位置我可以用root函数得到,其他的节点位置我都不知道,该怎么建立实例?

如果可以,能给出建立图示二叉树实例的代码吗?

#二叉树的链式储存结构
class LinkedBinaryTree(BinaryTree):
    '''链式储存结构实现二叉树'''
    
    class _Node:
        __slots__='_element','_parent','_left','_right'
        def __init__(self,element,parent=None,left=None,right=None):
            self._element=element
            self._parent=parent
            self._left=left
            self._right=right
            
    class Position(BinaryTree.Position):
        '''元素的保存地址'''
        
        def __init__(self,container,node):
            '''构造函数不应由用户调用'''
            self._container=container
            self._node=node
            
        def element(self):
            '''返回保存在地址中的元素'''
            return self._node._element
        
        def __eq__(self,other):
            '''判断两个实例是否相同'''
            return type(other) is type(self) and other._node is self._node
        
    def _validate(self,p):
        '''返回关联的节点,如果位置有效'''
        if not isinstance(p,self.Position):
            raise TypeError('p must be proper Position type')
        if p._container is not self:
            raise ValueError('p does not belong to this container')
        if p._node._parent is p._node:
            raise ValueError('p is no longer valid')
        return p._node

    def _make_position(self,node):
        '''把节点封装进position实例'''
        return self.Position(self,node) if node is not None else None
        
    def __init__(self):
        '''创建一个空的树'''
        self._root=None
        self._size=0
        
    def __len__(self):
        '''返回所有元素的数量'''
        return self._size
    
    def root(self):
        '''返回根节点的地址'''
        return self._make_position(self._root)
    
    def parent(self,p):
        '''返回p的父节点'''
        node=self._validate(p)
        return self._make_position(node._parent)
    
    def left(self,p):
        '''返回左孩子的地址'''
        node=self._validate(p)
        return self._make_position(node._left)
    
    def right(self,p):
        '''返回右孩子的地址'''
        node=self._validate(p)
        return self._make_position(node._right)
    
    def num_children(self,p):
        '''返回p节点的孩子数'''
        node=self._validate(p)
        count=0
        if node._left is not None:
            count+=1
        if node._right is not None:
            count+=1
        return count
    
    #非公开更新方法
    def _add_root(self,e):
        '''添加根节点,假如已经有根节点,抛出错误'''
        if self._root is not None:raise ValueError('Root exists')
        self._size+=1
        self._root=self._Node(e)
        return self._make_position(self._root)
    
    def _add_left(self,p,e):
        '''给节点p添加左孩子e,如果已经有左孩子,抛出错误'''
        node=self._validate(p)
        if node._left is not None:raise ValueError('Left child exists')
        self._size+=1
        node._left=self._Node(e,node)
        return self._make_position(node._left)
    
    def _add_right(self,p,e):
        '''给节点p添加右孩子e,如果已经有右孩子,抛出错误'''
        node=self._validate(p)
        if node._right is not None:raise ValueError('Right child exists')
        self._size+=1
        node._right=self._Node(e,node)
        return self._make_position(node._right)
    
    def _replace(self,p,e):
        '''用e代替p位置的元素,并返回被替换的元素'''
        node=self._validate(p)
        old=node._element
        node._element=e
        return old
    
    def _delete(self,p):
        '''删除位置p的节点,并用他的孩子代替他(如果有孩子),并返回p位置的元素,
        如果有两个孩子,抛出错误'''
        node=self._validate(p)
        if self.num_children(p)==2:raise ValueError('p has two children')
        child=node._left if node._left else node._right
        if child is not None:
            child._parent=node._parent#爷爷变成孩子的父亲
        if node is self._root:
            self._root=child
        else:
            parent=node._parent
            if node is parent._left:
                parent._left=child
            else:
                parent._right=child
        self._size-=1
        node._parent=node
        return node._element
    
    def _attach(self,p,t1,t2):
        '''把树ti和t2当成左右孩子给叶节点p,并清空t1,t2'''
        node=self._validate(p)
        if not self.is_leaf(p):raise ValueError('position must be leaf')
        if not type(self) is type(t1) is type(t2):
            raise TypeError('Tree types must match')
        self._size+=len(ti)+len(t2)
        if not t1.is_empty():
            t1._root._parent=node
            node._left=t1._root
            t1._root=None
            t1._size=0
        if not t2.is_empty():
            t2._root._parent=node
            node._right=t2._root
            t2._root=None
            t2._size=0
    

1个回答

+2 投票
用户: 10 9 8 (5.7k 分)
采纳于 用户:
 
已采纳
二叉树是用什么结构来存储的呢,能发一下完整的信息吗
用户: 10 10 9 (8.6k 分)
用链表储存,完整代码有点长,放在问题里了
用户: 10 9 8 (5.7k 分)
我的理解来看目前已知的是每个节点的父节点和它的值,用[parent, value]表示的话。目前已知以下数据 [0,1](父节点是0,表示为根) [2,1]、[3,1]、[4,2]、[5,2]、[6,3]、[7,3]、[8,5]、[9,5]
应该可以按照以下顺序构造?
root = _add_root(root()):
n2 = _add_left(root, 2)
n3 = _add_right(root, 3)
n4 = _add_left(n2, 4)
....
用户: 10 10 9 (8.6k 分)
但是_add_left()和_add_right()难道接受的参数不是父节点的位置和添加的节点的值吗
用户: 10 9 8 (5.7k 分)
add_root # 返回了根节点的位置
n2 = add_left(root, 2) # 参数为 n2节点 的父节点位置 root 和 n2 节点的值2,返回值为n2的位置。
n3 = add_left(root, 3) # 参数为 n3节点 的父节点位置 root 和 n3 节点的值3,返回值为n3的位置。
n4 = add_left(n2, 4) # 参数为 n4节点 的父节点位置 n3 和 n2 节点的值2,返回值为n4的位置。
用户: 10 10 9 (8.6k 分)
懂了懂了,谢谢
欢迎来到 在线问答系统 ,有什么不懂的可以尽管在这里提问,你将会收到社区其他成员的回答。
...