二叉树层序遍历:根据后序遍历和中序遍历构建树
要实现树的层序遍历,首先需要构建二叉树的数据结构。可以使用一个TreeNode类来表示二叉树的节点:\n\npython\nclass TreeNode:\n def __init__(self, val=0, left=None, right=None):\n self.val = val\n self.left = left\n self.right = right\n\n\n接下来,可以使用后序遍历和中序遍历的结果构建二叉树。根据后序遍历的特点,最后一个节点一定是根节点。然后根据根节点在中序遍历中的位置,可以将中序遍历序列分为左子树和右子树的序列。然后递归构建左子树和右子树。\n\npython\ndef buildTree(inorder, postorder):\n if not inorder or not postorder:\n return None\n \n root_val = postorder[-1]\n root = TreeNode(root_val)\n \n root_idx = inorder.index(root_val)\n \n left_inorder = inorder[:root_idx]\n right_inorder = inorder[root_idx+1:]\n \n left_postorder = postorder[:len(left_inorder)]\n right_postorder = postorder[len(left_inorder):-1]\n \n root.left = buildTree(left_inorder, left_postorder)\n root.right = buildTree(right_inorder, right_postorder)\n \n return root\n\n\n最后,可以使用队列来实现层序遍历。首先将根节点加入队列,然后循环进行以下操作:弹出队列中的节点,将节点的值加入结果列表,然后将节点的左子节点和右子节点加入队列。直到队列为空。\n\npython\nfrom collections import deque\n\ndef levelOrder(root):\n if not root:\n return []\n \n queue = deque([root])\n result = []\n \n while queue:\n node = queue.popleft()\n result.append(node.val)\n \n if node.left:\n queue.append(node.left)\n if node.right:\n queue.append(node.right)\n \n return result\n\n\n最后,可以按照输入格式读取输入,并调用上述函数进行处理,并输出结果。\n\npython\nN = int(input())\npostorder = list(map(int, input().split()))\ninorder = list(map(int, input().split()))\n\nroot = buildTree(inorder, postorder)\nresult = levelOrder(root)\n\nprint(' '.join(map(str, result)))\n\n\n完整代码如下:\n\npython\nfrom collections import deque\n\nclass TreeNode:\n def __init__(self, val=0, left=None, right=None):\n self.val = val\n self.left = left\n self.right = right\n\ndef buildTree(inorder, postorder):\n if not inorder or not postorder:\n return None\n \n root_val = postorder[-1]\n root = TreeNode(root_val)\n \n root_idx = inorder.index(root_val)\n \n left_inorder = inorder[:root_idx]\n right_inorder = inorder[root_idx+1:]\n \n left_postorder = postorder[:len(left_inorder)]\n right_postorder = postorder[len(left_inorder):-1]\n \n root.left = buildTree(left_inorder, left_postorder)\n root.right = buildTree(right_inorder, right_postorder)\n \n return root\n\ndef levelOrder(root):\n if not root:\n return []\n \n queue = deque([root])\n result = []\n \n while queue:\n node = queue.popleft()\n result.append(node.val)\n \n if node.left:\n queue.append(node.left)\n if node.right:\n queue.append(node.right)\n \n return result\n\nN = int(input())\npostorder = list(map(int, input().split()))\ninorder = list(map(int, input().split()))\n\nroot = buildTree(inorder, postorder)\nresult = levelOrder(root)\n\nprint(' '.join(map(str, result)))\n
原文地址: https://www.cveoy.top/t/topic/pzwI 著作权归作者所有。请勿转载和采集!