数据结构_线索二叉树_python实现

线索二叉树

线索二叉树是在普通二叉树的基础上对根节点上的空指针域做了改变,定义使左指针指向当前节点的前驱节点,右指针指向当前节点的后继节点。这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。

线索二叉树应用案例
在这里插入图片描述
说明: 当线索化二叉树后,Node节点的 属性 left 和 right ,有如下情况:
(1) left 指向的是左子树,也可能是指向的前驱节点. 比如 ① 节点 left 指向的左子树, 而 ⑩ 节点的 left 指向的就是前驱节点.
(2) right指向的是右子树,也可能是指向后继节点,比如 ① 节点right 指向的是右子树,而⑩ 节点的right 指向的是后继节点.

这次代码主要使用python来完成将普通二叉树转变成中序线索二叉树。根据上面的照片来构建二叉树。代码完成后通过调用叶子节点的left和right来测试代码正确与否。

先来分析一下10号节点,根据我们对线索二叉树的定义可知。我们需要先要先得到二叉树的中序遍历序列:{8, 3, 10, 1, 14, 6}。所以10号节点的前驱节点为3,后继节点为1。所以如果线索化是正确的,我们调用10号节点的左右指针,得到的两个节点为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