二叉树的创建与递归和非递归遍历

瘦欲@ 提交于 2020-01-29 23:53:28

二叉树的常规操作就是遍历,这也是二叉树的基本功之一

class TreeNode():
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class BinaryTree(object):
    def __init__(self, pre, tin):
        self.pre = pre
        self.tin = tin
        self.levelTrave = [] # 层次遍历结果
        self.preTraveRecur = [] # 前序递归遍历结果
        self.preTraveNoRecur = [] # 前序非递归遍历结果
        self.inTraveRecur = [] # 中序递归遍历结果
        self.inTraveNoRecur = [] # 中序非递归遍历结果
        self.postTraveRecur = [] # 后序递归遍历结果
        self.postTraveNoRecur = [] # 后序非递归遍历结果

    # 利用前序遍历和中序遍历结果重建二叉树
    def reConstructBinaryTree(self, pre, tin): # pre为前序遍历结果,tin为中序遍历结果
        if len(pre) == 0:
            return None
        if len(pre) == 1:
            return TreeNode(pre[0])
        else:
            res = TreeNode(pre[0])
            res.left = self.reConstructBinaryTree(pre[1:tin.index(pre[0]) + 1], tin[:tin.index(pre[0])])
            res.right = self.reConstructBinaryTree(pre[tin.index(pre[0]) + 1:], tin[tin.index(pre[0]) + 1:])
        return res

    # 层次遍历
    def levelTraversal(self, pRoot):
        aux = []
        if pRoot != None: # 将开始的非空根节点加入到aux列表中
            aux = [pRoot]

        while len(aux): # 判断aux列表中是否还有元素,如果有元素继续访问,否则遍历结束
            p = aux.pop(0) # 模拟队列每次取列表首元素
            self.levelTrave.append(p.val)
            if p.left != None: # 如果当前首元素有左节点将其加入aux列表尾部
                aux.append(p.left)
            if p.right != None: # 如果当前首元素有右节点将其加入aux列表尾部
                aux.append(p.right)

    # 前序递归遍历
    def preorderTraversalRecursion(self, pRoot):
        if pRoot == None:
            return
        self.preTraveRecur.append(pRoot.val) #!!!!!!!
        if pRoot.left != None:
            self.preorderTraversalRecursion(pRoot.left)
        if pRoot.right != None:
            self.preorderTraversalRecursion(pRoot.right)

    # 前序非递归遍历
    def preorderTraversalNoRecursion(self, pRoot):
        if pRoot == None:
            return
        aux = []
        node = pRoot
        while node or aux:
            while node:
                # 从根节点开始,一直找它的左子树
                self.preTraveNoRecur.append(node.val)
                aux.append(node)
                node = node.left
                # while结束表示当前节点node为空,即前一个节点没有左子树了
            node = aux.pop()
            # 开始查看它的右子树
            node = node.right

    # 中序递归遍历
    def inorderTraversalRecursion(self, pRoot):
        if pRoot == None:
            return
        if pRoot.left != None:
            self.inorderTraversalRecursion(pRoot.left)
        self.inTraveRecur.append(pRoot.val) # !!!!!!!!
        if pRoot.right != None:
            self.inorderTraversalRecursion(pRoot.right)

    # 中序非递归遍历
    def inorderTraversalNoRecursion(self, pRoot):
        if root == None:
            return
        aux = []
        node = root
        while node or aux:
            while node:
                #  从根节点开始,一直找到左子树
                aux.append(node)
                node = node.left
            # while结束表示当前节点node为空,即前一个节点没有左子树了
            node = aux.pop()
            self.inTraveNoRecur.append(node.val)
            node = node.right

    # 后序递归遍历
    def postorderTraversalRecursion(self, pRoot):
        if pRoot == None:
            return
        if pRoot.left != None:
            self.postorderTraversalRecursion(pRoot.left)
        if pRoot.right != None:
            self.postorderTraversalRecursion(pRoot.right)
        self.postTraveRecur.append(pRoot.val) # !!!!!!

    # 后序非递归遍历
    def postorderTraversalNoRecursion(self, pRoot):
        if root == None:
            return
        aux = []
        node = root
        while node or aux:
            while node:
                # 从根节点开始,一直找它的右子树
                self.postTraveNoRecur.insert(0, node.val)
                aux.append(node)
                node = node.right
            # while结束表示当前节点node为空,即前一个节点没有右子树了
            node = aux.pop()
            # 开始查看它的左子树
            node = node.left

if __name__ == '__main__':
    # 利用前序与中序遍历重建二叉树
    pre = [1, 2, 4, 7, 3, 5, 6, 8]
    tin = [4, 7, 2, 1, 5, 3, 8, 6]
    BT = BinaryTree(pre, tin)
    root = BT.reConstructBinaryTree(BT.pre, BT.tin)

    # 层次遍历
    BT.levelTraversal(root)
    print("层次遍历结果:", BT.levelTrave)

    # 前序递归遍历
    BT.preorderTraversalRecursion(root)
    print("前序递归遍历:", BT.preTraveRecur)

    # 前序非递归遍历
    BT.preorderTraversalNoRecursion(root)
    print("前序非递归遍历:", BT.preTraveNoRecur)

    # 中序递归遍历
    BT.inorderTraversalRecursion(root)
    print("中序递归遍历:", BT.inTraveRecur)

    # 中序非递归遍历
    BT.inorderTraversalNoRecursion(root)
    print("中序非递归遍历", BT.inTraveNoRecur)

    # 后序递归遍历
    BT.postorderTraversalRecursion(root)
    print("后序递归遍历", BT.postTraveRecur)

    # 后序非递归遍历
    BT.postorderTraversalNoRecursion(root)
    print("后序非递归遍历", BT.postTraveNoRecur)

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!