JZ18 二叉树镜像

Wesley13
• 阅读 639

JZ18 二叉树镜像

题目

操作给定的二叉树,将其变换为源二叉树的镜像。

思路

  • 先遍历, 节点入栈, 再依次出栈调换左右节点
  • 遍历的过程中调换左右节点

代码

# -*- coding:utf-8 -*-
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 先遍历, 入栈, 再调换左右节点
    def Mirror(self, root):
        # 判断传入节点是否为空
        if root is None:
            return None
        line_node = self.printLevelNode(root)
        # print(line_node)
        while line_node:
            tmp = line_node.pop()
            if tmp.left or tmp.right:
                tmp.left, tmp.right = tmp.right, tmp.left
        return tmp
    # 层次遍历二叉树, 被调用
    def printLevelNode(self, root):
        line_node = []
        res = []
        line_node.append(root)
        while line_node:
            tmp = line_node.pop(0)
            res.append(tmp)
            if tmp.left:
                line_node.append(tmp.left)
            if tmp.right:
                line_node.append(tmp.right)
        return res

    # 层次遍历的过程中调换左右节点
    def Mirror2(self, root):
        if root is None:
            return None
        line_node = []
        line_node.append(root)
        while line_node:
            tmp = line_node.pop(0)
            if tmp.left:
                line_node.append(tmp.left)
            if tmp.right:
                line_node.append(tmp.right)
            # if tmp.left or tmp.right:
            tmp.left, tmp.right = tmp.right, tmp.left
        return root

    # 递归遍历的过程中调换左右节点
    def Mirror3(self, root):
        if root is None:
            return None
        root.left, root.right = root.right, root.left
        self.Mirror3(root.left)
        self.Mirror3(root.right)
        return root


if __name__ == '__main__':
    node1 = TreeNode(8)
    node2 = TreeNode(6)
    node3 = TreeNode(10)
    node4 = TreeNode(5)
    node5 = TreeNode(7)
    node6 = TreeNode(9)
    node7 = TreeNode(11)
    node1.left = node2
    node1.right = node3
    node2.left = node4
    node2.right = node5
    node3.left = node6
    node3.right = node7
    sl = Solution()
    ls = sl.Mirror3(node1)
    print(ls)
    for i in sl.printLevelNode(ls):
        print(i.val)
点赞
收藏
评论区
推荐文章
白茶清欢 白茶清欢
3年前
js实现二叉树、二叉查找树
树是一种数据结构,该章节讨论二叉树(二叉树的每个节点的子节点不允许超过两个),二叉树中有又分为完全二叉树和不完全二叉树.....不在本章节赘述相关概念,感兴趣可以去查阅《数据结构》。你将会获得:1.如何使用js实现二叉查找树。2.学会前、中、后序遍历。3.了解相关实现原理阅读时长5min,可选择直接调试代码特点    二叉查找树中序遍历后
桃浪十七丶 桃浪十七丶
3年前
用C语言的递归写个二叉搜索树(二叉排序树)
不会递归的程序员不是好程序员,虽然鄙人尚未毕业,是个无知的大学生。但这追去真理的上进心不可小量。二叉树的每一个节点,与其左右子树都可以组成一个二叉树,利用这思路,可以写个递归形式的二叉树。cinclude<stdio.hinclude<stdlib.htypedefstructtreeNodeintdata;structtreeNodeLeft
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
22 22
3年前
二叉树创建后,如何使用递归和栈遍历二叉树?
0.前言前文主要介绍了树的相关概念和原理,本文主要内容为二叉树的创建及遍历的代码实现,其中包括递归遍历和栈遍历。1.二叉树的实现思路1.0.顺序存储——数组实现前面介绍了满二叉树和完全二叉树,我们对其进行了编号——从0到n的不中断顺序编号,而恰好,数组也有一个这样的编号——数组下标,只要我们把二者联合起来,数组就能存储二叉树了。那么非满
Wesley13 Wesley13
3年前
JAVA递归实现线索化二叉树
JAVA递归实现线索化二叉树基础理论首先,二叉树递归遍历分为先序遍历、中序遍历和后序遍历。先序遍历为:根节点左子树右子树中序遍历为:左子树根节点右子树后序遍历为:左子树右子树根节点(只要记住根节点在哪里就是什么遍历,且都是先左再右)线索化现在有这么一棵二叉树,它的数据结
Stella981 Stella981
3年前
LeetCode(110):平衡二叉树
Easy!题目描述:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树_每个节点_的左右两个子树的高度差的绝对值不超过1。示例1:给定二叉树 3,9,20,null,null,15,73/\920/
Wesley13 Wesley13
3年前
04.重建二叉树 (Java)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。(https://www.oschina.net/action/GoToLink?urlht
Stella981 Stella981
3年前
LeetCode112
非商业,LeetCode链接附上:https://leetcodecn.com/problems/pathsum/进入正题。题目:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和
菜园前端 菜园前端
1年前
什么是二叉树?
原文链接:什么是二叉树?树中每个节点最多只能有两个子节点,在JavaScript中一般都是通过Object来模拟二叉树。常用操作前序遍历中序遍历后序遍历前序遍历根左右。口诀:1.访问根节点2.对根节点的左子树进行前序遍历3.对根节点的右子树进行前序遍历通过
菜园前端 菜园前端
1年前
什么是堆?
原文链接:什么是堆?堆是一种特殊的完全二叉树。完全二叉树的含义就是每层节点都完全填满,除了最后一层外只允许最右边缺少若干个节点。在JavaScript中通常用数组表示堆(按照广度优先遍历顺序)。最大堆最小堆特性所有的节点都大于等于它的子节点(最大堆)或者所