python数据结构之二叉树及其递归遍历和非递归遍历(非递归原创,递归参考别人代码)

二叉树创建及递归和非递归代码如下:

stack = []
stack1 =  []
class TreeNode(object):
    def __init__(self, data = 0,left = 0, right = 0):
        self.data = data
        self.left = left
        self.right = right

class Tree(object):
    def __init__(self, root = 0):
        self.root = root

    def Isempty(self):
        if self.root == 0:
            return True
        return False

    def preOrder(self, treenode):
        if treenode == 0:
            return
        print(treenode.data)
        self.preOrder(treenode.left)
        self.preOrder(treenode.right)

    def InOrder(self, treenode):
        if treenode == 0:
            return
        self.InOrder( treenode.left)
        print(treenode.data)
        self.InOrder(treenode.right)

    def PostOrder(self, treenode):
        if treenode == 0:
            return
        self.PostOrder(treenode.left)
        self.PostOrder(treenode.right)
        print(treenode.data)

    def preOrderWithStack(self, treenode):
        if treenode is 0:
            print('the tree is null can not show!')
            return
        p = treenode
        print('*******************', len(stack))
        while len(stack) != 0 or p != 0:
            while p != 0:
                print(p.data)
                stack.append(p)
                p = p.left
            node = stack.pop()
            p = node.right

    def InOrderWithStack(self, treenode):
        if treenode is 0:
            print('the tree is null can not show!')
            return
        p = treenode
        print('*******************', len(stack))
        while len(stack) != 0 or p != 0:
            while p != 0:
                stack.append(p)
                p = p.left
            node = stack.pop()
            print(node.data)
            p = node.right

    def PostOrderWithStack(self, treenode):
        if treenode is 0:
            print('the tree is null can not show!')
            return
        p = treenode
        print('*******************', len(stack))
        while len(stack) != 0 or p != 0:
            while p != 0:
                stack.append(p)
                stack1.append(p)
                p = p.right
            node = stack.pop()
            p = node.left
        stack1.reverse()
        for node in (stack1):
            print(node.data)




#测试用例1测试出后序遍历有问题
n1 = TreeNode(1, 0, 0)
n4 = TreeNode(4, 0, 0)
n3 = TreeNode(3, n4, 0)
root = TreeNode(2, n1, n3)
tree = Tree(root)
'''
d = TreeNode('d', 0 , 0)#创建叶子节点
e = TreeNode('e', 0, 0)
b = TreeNode('b', d, e)#创建父节点
f = TreeNode('f', 0, 0)
c = TreeNode('c', f, 0)
a = TreeNode('a', b, c)#创建根节点
tree = Tree(a)

#测试用例3测试出前序遍历有问题
n4 = TreeNode(4, 0, 0)
n1 = TreeNode(1, 0, n4)
n3 = TreeNode(3, 0, 0)
root = TreeNode(2, n1, n3)
tree = Tree(root)
'''
print(tree.Isempty())
print("前序遍历:")
tree.preOrder(tree.root)
print("非递归前序遍历:")
tree.preOrderWithStack(tree.root)
print("中序遍历:")
tree.InOrder(tree.root)
print("非递归中序遍历:")
tree.InOrderWithStack(tree.root)
print("后序遍历:")
tree.PostOrder(tree.root)
print("非递归后序遍历:")
tree.PostOrderWithStack(tree.root)

运行结果如下:

C:\Users\snowshuang\AppData\Local\Programs\Python\Python37\python.exe C:/Users/snowshuang/PycharmProjects/logging/log1.py
False
前序遍历:
2
1
3
4
非递归前序遍历:
******************* 0
2
1
3
4
中序遍历:
1
2
4
3
非递归中序遍历:
******************* 0
1
2
4
3
后序遍历:
1
4
3
2
非递归后序遍历:
******************* 0
1
4
3
2

Process finished with exit code 0
非递归采用堆栈遍历,python比c语言好的地方是python的list原生支持堆栈,省去了搭建堆栈的代码。比c语言还简单!

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值