LeetCode,二叉树的层次遍历、逆转

1. 基本知识

1.1 二叉树的层次遍历

二叉树的层次遍历是指一层一层地遍历二叉树,并按照每层为一个列表返回,实例如下,

图1. 二叉树的层次遍历

二叉树1的层次遍历结果为:[[1] [2, 3] [4, 5, 6, 7]];

二叉树2的层次遍历结果为:[[1], [2, 3], [6, 7]]

层次遍历的特点为不按照左右节点优先遍历某 一遍,而是先将同一层的元素先全部遍历结束。因此,层次遍历的算法考虑先将某一层的节点存储如列表,等访问完该层后,再访问该层所有的左右节点。算法步骤如下,

初始化:首先定义访问列表to_visit为下一层需要访问的所有节点,初始化为只含有根节点的列表;定义结果列表r:

(1)遍历变量to_visit,

(2)当前节点的值存入结果;

(3)访问列表to_visit的值更新append为当前列表中所有左右节点;

直到to_visit为空列表[]时,返回结果。

1.2 逆二叉树

逆二叉树为将二叉树的左右枝反转。以图1为例,将其进行逆转之后结果如下,

图2. 二叉树逆转

在进行二叉树的遍历时,每个节点的左右都要交换,直到节点为空,因此,从该思路来看,该逆转的思路是递归算法。算法如下,

(1)初始化,从根部节点开始;

(2)若是当前节点有右半部分,那么其新的左半部分=右半部分;否则左半部分为空;右节点为根节点递归逆转;

(3)若是当前节点有左半部分,那么其新的右半部分=左半部分;否则右半部分为空;左节点为根节点递归逆转。

直到节点为空为止。

在这个里面有一个细节值得注意,在右半部分非空的时候,不能直接将节点的左半部分赋值为右半部分,需要暂时存储起来,等到判断完左半部分之后才能处理右半部分的赋值。

一定注意!!!:在Python中,object1=object,在修改object1的时候,object也会随之改变,因其地址为相同的,指向同一地址。在Python内置的数据类型,tmp=a.clone(),可以避免在tmp发生改变时改变a的值。但是自己定义的类就不能这样操作啦~~~~参考,让一个对象=另一个对象,修改一个对象的值,如何不影响另一个的值_VR_wangkr的博客-CSDN博客_java对象赋值给另一个对象怎么才能不变成一个对象​​​​​​

2. 代码

2.1 二叉树的层次遍历

LeetCode107,力扣

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

图3. 层数遍历示例

代码如下,

# Definition for a binary tree node.
class TreeNode(object):
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

    def set_left(self, left):
        self.left = left

    def set_right(self, right):
        self.right = right

class Solution(object):
    def levelOrderBottom(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        r = []
        if root == None:
            return []
        current = [root]
        while current != []:
            tmp = []
            r_tmp = []
            for node in current:
                r_tmp.append(node.val)
                if node.left != None:
                    tmp.append(node.left)
                if node.right != None:
                    tmp.append(node.right)
            r.append(r_tmp)
            current = tmp

        r.reverse()
        return r

if __name__ == '__main__':
    root = [1,  2, 3]
    node1 = TreeNode(3)
    node2 = TreeNode(9)
    node3 = TreeNode(20)
    node4 = TreeNode(15)
    node5 = TreeNode(7)

    node1.set_left(node2)
    node1.set_right(node3)

    node3.set_left(node4)
    node3.set_right(node5)

    sol = Solution()
    # r = sol.preorderTraversal(node1)
    r = sol.levelOrderBottom(node1)
    r1 = sol.invertTree(node1)
    print(r)

 2.2 逆二叉树

LeetCode226,力扣

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

图4. 逆二叉树示例

代码如下,

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        if root == None:
            return 
        r = root
        flag = 0 
        if root.right != None:
            flag = 1
            tmp = self.invertTree(root.right)
            
        if root.left != None:
            root.right =  self.invertTree(root.left)
        else:
            root.right = None

        if flag == 1:
            root.left = tmp
        else:
            root.left = None
        return r

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值