利用顺序存储结构二叉树的中序序列和后序序列构造二叉树

假设二叉树采用顺序存储结构存储,每个结点值为单个字符并且所有结点值不相等,如何让二叉树的中序序列和后序序列构造二叉树,然后实现查找、求高度、先序通历、中序遍历、后序遍历和层次遍历算法

顺序存储,就是每个节点i的子节点为i2+1和i2+2,而对于i节点,其父节点为i-1//2
别的和链式存储的没啥区别了。

构造:

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

def build_tree(inorder, postorder):
    if not inorder:
        return None
    root_val = postorder[-1]
    root = TreeNode(root_val)
    root_idx = inorder.index(root_val)
    left_inorder = inorder[:root_idx]
    right_inorder = inorder[root_idx+1:]
    left_postorder = postorder[:len(left_inorder)]
    right_postorder = postorder[len(left_inorder):-1]
    root.left = build_tree(left_inorder, left_postorder)
    root.right = build_tree(right_inorder, right_postorder)
    return root

查找:

def search(root, val):
    if not root or root.val == val:
        return root
    if val < root.val:
        return search(root.left, val)
    else:
        return search(root.right, val)

求高度:

def height(root):
    if not root:
        return 0
    return max(height(root.left), height(root.right)) + 1

先序遍历:

def preorder(root):
    if not root:
        return
    print(root.val, end=' ')
    preorder(root.left)
    preorder(root.right)

中序遍历:

def inorder(root):
    if not root:
        return
    inorder(root.left)
    print(root.val, end=' ')
    inorder(root.right)

后序遍历:

def postorder(root):
    if not root:
        return
    postorder(root.left)
    postorder(root.right)
    print(root.val, end=' ')

层次遍历:

from collections import deque

def level_order(root):
    if not root:
        return
    q = deque([root])
    while q:
        node = q.popleft()
        print(node.val, end=' ')
        if node.left:
            q.append(node.left)
        if node.right:
            q.append(node.right)

如果答案对您有帮助,望采纳。

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

class BinaryTree:
    def __init__(self, inorder, postorder):
        # 构造二叉树
        self.root = self.buildTree(inorder, postorder)
    
    def buildTree(self, inorder, postorder):
        if not inorder:
            return None
        
        # 后序遍历的最后一个节点是当前子树的根节点
        root_val = postorder.pop()
        root = TreeNode(root_val)
        
        # 在中序遍历中找到根节点的位置,划分左右子树
        inorder_index = inorder.index(root_val)
        left_inorder = inorder[:inorder_index]
        right_inorder = inorder[inorder_index+1:]
        
        # 根据中序序列的划分,划分后序序列
        left_postorder = postorder[:len(left_inorder)]
        right_postorder = postorder[len(left_inorder):]
        
        # 递归构建左右子树
        root.left = self.buildTree(left_inorder, left_postorder)
        root.right = self.buildTree(right_inorder, right_postorder)
        
        return root
    
    def find(self, value):
        # 查找节点是否存在
        node = self.root
        while node:
            if node.value == value:
                return True
            elif node.value > value:
                node = node.left
            else:
                node = node.right
        return False
    
    def height(self, root):
        # 求树的高度
        if not root:
            return 0
        left_height = self.height(root.left)
        right_height = self.height(root.right)
        return max(left_height, right_height) + 1
    
    def preorderTraversal(self, root):
        # 先序遍历
        if not root:
            return []
        return [root.value] + self.preorderTraversal(root.left) + self.preorderTraversal(root.right)
    
    def inorderTraversal(self, root):
        # 中序遍历
        if not root:
            return []
        return self.inorderTraversal(root.left) + [root.value] + self.inorderTraversal(root.right)
    
    def postorderTraversal(self, root):
        # 后序遍历
        if not root:
            return []
        return self.postorderTraversal(root.left) + self.postorderTraversal(root.right) + [root.value]
    
    def levelOrderTraversal(self, root):
        # 层次遍历
        if not root:
            return []
        queue = [root]
        res = []
        while queue:
            level_size = len(queue)
            level_nodes = []
            for _ in range(level_size):
                node = queue.pop(0)
                level_nodes.append(node.value)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            res.append(level_nodes)
        return res