新手求助帖python二叉树遍历方法及其求二叉树高度

python二叉树遍历方法及其求二叉树高度

新人求助
先上代码

代码:

class BinaryTreeNode(object):
    def __init__(self):
        self.data='#'
        self.leftchild=None
        self.rightchild=None
class TreeState(object):
    def __init__(self,BinaryTreeNode,VisitedFlag):
        self.BinaryTreeNode = BinaryTreeNode
        self.VisitedFlag = VisitedFlag
class BinaryTree(object):
    def Createtree(self,Root):
        data=input('->')
        if data=='#':
            Root=None
        else:
            Root.data=data
            Root.leftchild=BinaryTreeNode()
            self.Createtree(Root.leftchild)
            Root.rightchild=BinaryTreeNode()
            self.Createtree(Root.rightchild)

    ###################################
    #先序遍历递归算法
    ###################################
    def PreOrder(self,Root):
        if Root is not None:
            self.VisitBinaryTreeNode(Root)
            self.PreOrder(Root.leftchild)
            self.PreOrder(Root.rightchild)

    ###################################
    #中序遍历递归算法
    ###################################
    def InOrder(self,Root):
        if Root is not None:
            self.InOrder(Root.leftchild)
            self.VisitBinaryTreeNode(Root)
            self.InOrder(Root.rightchild)

    ###################################
    #后序遍历递归算法
    ###################################
    def PostOrder(self,Root):
        if Root is not None:
            self.PostOrder(Root.leftchild)
            self.PostOrder(Root.rightchild)
            self.VisitBinaryTreeNode(Root)

    ###################################
    #先序遍历非递归算法
    ###################################
    def PreOrderNonRecursive(self,Root):
        StackTreeNode=[]
        tTreeNode=Root
        while len(StackTreeNode)>0 or tTreeNode is not None:
            while tTreeNode is not None:
                self.VisitBinaryTreeNode(tTreeNode)
                StackTreeNode.append(tTreeNode)
                tTreeNode=tTreeNode.leftchild
            if len(StackTreeNode)>0:
                tTreeNode=StackTreeNode.pop()
                tTreeNode=tTreeNode.rightchild
    
    ###################################
    #中序遍历非递归算法
    ###################################
    def InOrderNonRecursive(self,Root):
        StackTreeNode=[]
        tTreeNode=Root
        while len(StackTreeNode)>0 or tTreeNode is not None:
            while tTreeNode is not None:
                StackTreeNode.append(tTreeNode)
                tTreeNode=tTreeNode.leftchild
            if len(StackTreeNode)>0:
                tTreeNode=StackTreeNode.pop()
                self.VisitBinaryTreeNode(tTreeNode)
                tTreeNode=tTreeNode.rightchild

    ###################################
    #后续序遍历非递归算法
    ###################################
    def PostOrderNonRecursive(self,Root):
        StackTreeNode=[]
        tBinaryTreeNode=Root
        tTree=None
        while tBinaryTreeNode is not None:
            tTree=TreeState(tBinaryTreeNode,0)
            StackTreeNode.append(tTree)
            tBinaryTreeNode=tBinaryTreeNode.leftchild
        while len(StackTreeNode)>0:
            tTree=StackTreeNode.pop()
            if tTree.BinaryTreeNode.rightchild is None or tTree.VisitedFlag==1:
                self.VisitBinaryTreeNode(tTree.BinaryTreeNode)
            else:
                StackTreeNode.append(tTree)
                tTree.VisitedFlag=1
                tBinaryTreeNode=tTree.BinaryTreeNode.rightchild
                while tBinaryTreeNode is not None:
                    tTree=TreeState(tBinaryTreeNode,0)
                    StackTreeNode.append(tTree)
                    tBinaryTreeNode=tBinaryTreeNode.leftchild
               
    def VisitBinaryTreeNode(self,BinaryTreeNode):
        if BinaryTreeNode.data is not '#':
            print(BinaryTreeNode.data)

    ###################################
    #二叉树高度
    ###################################
    def Depth(self,Root):
        if Root is None:
                return 0
        else:
                return max(self.Depth(Root.leftchild),self.Depth(Root.rightchild))+1
            

btn=BinaryTreeNode()
tree=BinaryTree()
tree.Createtree(btn)
print("先序遍历: ")
tree.PreOrder(btn)
print("中序遍历: ")
tree.InOrder(btn)
print("后序遍历: ")
tree.PostOrder(btn)
print("先序遍历非递归: ")
tree.PreOrderNonRecursive(btn)
print("中序遍历非递归: ")
tree.InOrderNonRecursive(btn)
print("后序遍历非递归: ")
tree.PostOrderNonRecursive(btn)
print("二叉树高度: ")
print(tree.Depth(btn))

输入值:

A
B
#
#
C
#
#

输出结果:

先序遍历:
A
B
C
中序遍历:
B
A
C
后序遍历:
B
C
A
先序遍历非递归:
A
B
C
中序遍历非递归:
B
A
C
后序遍历非递归:
B
C
A
二叉树高度:
3

上面遍历代码结果是对的可是在进行二叉树高度计算的时候,答案始终+1,不知道应该如何去除
求大佬解惑!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

??_Transparent

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值