首页 > 试题广场 >

输出二叉树的右视图

[编程题]输出二叉树的右视图
  • 热度指数:48221 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图

数据范围:
要求: 空间复杂度 ,时间复杂度

如输入[1,2,4,5,3],[4,2,5,1,3]时,通过前序遍历的结果[1,2,4,5,3]和中序遍历的结果[4,2,5,1,3]可重建出以下二叉树:

所以对应的输出为[1,3,5]。
示例1

输入

[1,2,4,5,3],[4,2,5,1,3]

输出

[1,3,5]

备注:
二叉树每个节点的值在区间[1,10000]内,且保证每个节点的值互不相同。
class Solution:
    def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]:
        if not preOrder:
            return []
        res = [preOrder[0]]
        index = inOrder.index(preOrder[0])
        # 左子树的右视图
        left = self.solve(preOrder[1:index+1], inOrder[:index])
        # 右子树的右视图
        right = self.solve(preOrder[index+1:], inOrder[index+1:])
        # 优先取右子树,剩余取左子树
        return res + right + left[len(right):]
编辑于 2024-01-06 01:46:22 回复(1)
from collections import deque
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]:
        val2idx = {}
        for i in range(len(inOrder)):
            val2idx[inOrder[i]] = i

        def dfs(root_idx, left, right):
            if left > right:
                return None
            # 在 inorder 中的索引
            index = val2idx[preOrder[root_idx]]
            root = TreeNode(inOrder[index])

            root.left = dfs(root_idx+1, left, index-1)
            root.right = dfs(root_idx-left+index+1, index+1, right)

            return root
        # 构建
        root = dfs(0, 0, len(inOrder)-1)

        # BFS 
        res = []
        if not root:
            return res
        q = deque([root])
        while q:
            n = len(q)
            res.append(q[0].val)
            for _ in range(n):
                cur = q.popleft()
                if cur.right:
                    q.append(cur.right)
                if cur.left:
                    q.append(cur.left)
        return res

发表于 2023-10-23 14:27:19 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 求二叉树的右视图
# @param preOrder int整型一维数组 先序遍历
# @param inOrder int整型一维数组 中序遍历
# @return int整型一维数组
from typing import List

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
class Solution:
    def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]:
        # write code here
        # 构建二叉树
        root = self.buildTree(preOrder, inOrder)

        # 打印二叉树的右视图
        return self.rightSideView(root)

    def buildTree(self, preOrder: List[int], inOrder: List[int]) -> TreeNode:
        if not preOrder&nbs***bsp;not inOrder:
            return None

        # 根节点的值为前序遍历的第一个元素
        root_val = preOrder[0]
        root = TreeNode(root_val)

        # 在中序遍历中找到根节点的位置
        root_index = inOrder.index(root_val)

        # 构建左子树
        left_preOrder = preOrder[1:root_index+1]
        left_inOrder = inOrder[:root_index]
        root.left = self.buildTree(left_preOrder, left_inOrder)

        # 构建右子树
        right_preOrder = preOrder[root_index+1:]
        right_inOrder = inOrder[root_index+1:]
        root.right = self.buildTree(right_preOrder, right_inOrder)

        return root

    def rightSideView(self, root: TreeNode) -> List[int]:
        if not root:
            return []

        result = []
        queue = [root]

        while queue:
            level_size = len(queue)

            # 遍历当前层级的节点
            for i in range(level_size):
                node = queue.pop(0)

                # 记录最右边的节点值
                if i == level_size - 1:
                    result.append(node.val)

                # 将下一层级的节点加入队列
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)

        return result

发表于 2023-10-17 15:41:21 回复(0)
class Solution:
    def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]:
        # write code here
        def dfs(preOrder, inOrder):
            if len(preOrder) == 0:
                return None
            if  len(preOrder) == 1 :
                return TreeNode(preOrder[0])
            root = TreeNode(preOrder[0])
            n = len(inOrder)
            index = 0
            for i in range(n):
                if inOrder[i] == preOrder[0]:
                    index = i
                    break
            root.left = dfs(preOrder[1:index+1], inOrder[0:index])
            root.right = dfs(preOrder[index+1:], inOrder[index+1:])

            return root

        if len(preOrder) == 0:
            return []

        root = dfs(preOrder, inOrder)
        resut = []
        que = []
        que.append(root)
        while len(que) != 0:
            N = len(que)
            for i in range(N):
                root = que.pop(0)
                if i == N-1:
                    resut.append(root.val)
                if root.left != None:
                    que.append(root.left)
                if root.right != None:
                    que.append(root.right)
        return resut
发表于 2023-08-14 17:03:34 回复(0)
也可以用递归的思路
class Solution:
    def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]:
        # write code here
        if (len(preOrder) == 0):
            return []
        
        for i in range(len(inOrder)):
            if (inOrder[i] == preOrder[0]):
                tmp1 = self.solve(preOrder[1:i+1], inOrder[0:i])
                tmp2 = self.solve(preOrder[i+1:], inOrder[i+1:])
                res_tmp = []
                if (len(tmp1) <= len(tmp2)):
                    res_tmp = tmp2
                else:
                    res_tmp = tmp2 + tmp1[len(tmp2):]
                return [preOrder[0]] + res_tmp 





发表于 2023-08-09 11:06:27 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 求二叉树的右视图
# @param xianxu int整型一维数组 先序遍历
# @param zhongxu int整型一维数组 中序遍历
# @return int整型一维数组
#
class Solution:
    def recure(self, pre: List[int], vin: List[int], start: int, end: int) -> TreeNode:
        if start == end:
            return None
        mid, idx = -1, start
        while mid == -1:
            for i in range(start, end):
                if vin[i] == pre[idx]:
                    mid = i
            idx = idx + 1
        root = TreeNode(vin[mid])
        left = self.recure(pre[1:], vin, start, mid)
        right = self.recure(pre, vin, mid + 1, end)
        root.left = left
        root.right = right
        return root

    def solve(self , xianxu: List[int], zhongxu: List[int]) -> List[int]:
        node = self.recure(xianxu, zhongxu, 0, len(zhongxu))
        tmp = [node]
        ret = []
        next = []
        while tmp:
            cur = tmp.pop(0)
            left, right = cur.left, cur.right
            if left:
                next.append(left)
            if right:
                next.append(right)
            if not tmp:
                ret.append(cur.val)
                tmp = next
                next = []
        return ret

发表于 2022-09-19 15:43:48 回复(0)

先把树构建出来,在通过队列取出每层的最后一个节点的值
时间复杂度:O(n) 空间复杂度:O(n)

class Solution:
    def tree(self, pre, vin):
        if not pre:
            return None
        root = TreeNode(pre[0])
        tem = vin.index(pre[0])
        root.left = self.tree(pre[1:tem+1], vin[:tem])
        root.right = self.tree(pre[tem+1:], vin[tem+1:])
        return root
    def solve(self , pre: List[int], vin: List[int]) -> List[int]:
        res = []
        root = self.tree(pre, vin)
        q = [root]
        while q:
            n = len(q)
            for i in range(n):
                cur = q.pop(0)
                if i == n-1:
                    res.append(cur.val)
                if cur.left:
                    q.append(cur.left)
                if cur.right:
                    q.append(cur.right)
        return res
发表于 2022-05-17 16:15:22 回复(0)