データ構造体_cueバイナリツリー_pythonの実装

手がかり二分木

手がかりの二分木は、通常の二分木に基づいています。ルートノードのnullポインターフィールドが変更されます。左のポインターは現在のノードの先行ノードを指し、右のポインターは現在のノードの後続ノードを指します。このような手がかりのあるバイナリリストはスレッドリストと呼ばれ、対応するバイナリツリーはスレッドバイナリツリー(Threaded BinaryTree)と呼ばれます。手がかりの異なる性質に従って、手がかり二分木は3つのタイプに分けることができます:事前注文手掛かり二分木、中間注文手掛かり二分木、および事後手掛かり二分木。

手がかりの二分木適用事例の
ここに画像の説明を挿入
説明:手がかりの二分木の後、ノードノードの左と右の属性は次のとおりです:
(1)左は左のサブツリーを指し、ポイントする前駆ノードである場合もあります。例:①ノードの左は左を指すサブツリー、および⑩ノードの左は先行ノードを指します
(2)右は右サブツリーを指し、後続ノードも指す場合があります。たとえば、①ノードは右サブツリーを指し、⑩ノードは右ノードを指します。後続ノードです。

今回は、コードは主にpythonを使用して、通常のバイナリツリーから中位の手がかりバイナリツリーへの変換を完了します。上記の写真に基づいてバイナリツリーを作成します。コードが完了した後、リーフノードの左と右を呼び出すことにより、コードの正当性がテストされます。

手掛かりの二分木の定義に従って、最初にノード10を分析しましょう。まず、バイナリツリーの中位トラバーサルシーケンスを取得する必要があります:{8、3、10、1、14、6}。したがって、ノード10の先行ノードは3で、後続ノードは1です。したがって、手掛かりが正しければ、ノード10の左と右のポインターを呼び出し、取得する2つのノードは3と1です。

#线索化二叉树
#二叉树

#先创建结点
class HeroNode(object):
    def __init__(self,no,name):
        self.no = no
        self.name= name
        self.left=None
        self.right=None
        '''
        1、如果leftType==0,表示指向左子树;
            leftType==1,表示指向前驱节点
        
        2、如果rightType==0,表示指向右子树;
            rightType==1,表示指向后继节点
        '''
        self.leftType=None
        self.rightType=None
    
    def setleft(self,node):
        self.left = node
    def setright(self,node):
        self.right = node
        
   
#中序遍历线索化
class ThreadBinaryTree(object):
    def __init__(self):
        self.root=None
        #为了实现线索化,需要增加这个属性,保留前一个节点
        self.pre=None
    def setRoot(self,root):
        self.root = root
    
    #编写二叉树进行线索的方法
    def threadedNode(self,node):
        if node == None:
            return
        
        self.threadedNode(node.left)
        
        #处理当前节点的的前驱节点
        if node.left==None:
            node.left=self.pre
            node.leftType=1
            
        if self.pre!=None and self.pre.right == None:
            #前驱节点的右指针指向当前节点
            self.pre.right=node
            self.pre.rightType=1
            
        self.pre = node
        
        self.threadedNode(node.right)
    
    def threadedList(self):
        node = self.root
        while(node!=None):
            
            while(node.leftType==0):
                node=node.left
                
            print("no = {}; name = {}".format(node.no,node.name))
            
            while(node.rightType==1):
                node=node.right
                print("no = {}; name = {}".format(node.no,node.name))
            
            node = node.right

            
node1 = HeroNode(1,'关胜')
node2 = HeroNode(3,'刘备')
node3 = HeroNode(6,'张飞')
node4 = HeroNode(8,'曹操')
node5 = HeroNode(10,'李逵')
node6 = HeroNode(14,'大力')

print('测试中序线索二叉树的功能')
tree = ThreadBinaryTree()
node1.setleft(node2)
node1.setright(node3)
node2.setleft(node4)
node2.setright(node5)
node3.setleft(node6)

tree.setRoot(node1)

tree.threadedNode(node1)

leftnode = node5.left
rightnode= node5.right
print('id={};name={}'.format(leftnode.no,leftnode.name))
print('id={};name={}'.format(rightnode.no,rightnode.name))


print('list:')
tree.threadedList()




コードを実行した結果は次のとおりです。
ここに画像の説明を挿入

元の記事を27件公開 賞賛2件 680回の訪問

おすすめ

転載: blog.csdn.net/qq_44273739/article/details/105498527