leetcode刷题-二叉树02

代码随想录二叉树part02|102.层序遍历、226.翻转二叉树、101.对称二叉树

102.层序遍历–十题

代码随想录文档讲解
LeetCode102

图论中的深度搜索和广度搜索分别对应二叉树中的递归遍历和层序遍历。

  	3
   /   \
  9		20
  		/	\
  	  15	 7

返回层序遍历结果:

[
[3],
[9, 20],
[15, 7]
]

依赖队列完成,每一层要记录队列中的size,以便后续弹出元素

伪代码c++

queue<TreeNode*> que;
if(root != NULL) que.push(root);
while( ! que){
	size = que.size();
	vector<int> vec;
	while(size--){
		node = que.front();
		que.pop();
		vec.push_back(node->val);
		if(node->left) que.push(node->left);
		if(node->right) que.push(right->right);
	}
	result.push_back(vec);
}

python代码

python collections.deque()简介

from collections import deque
str = 'abcd'
dstr = deque(str)
# dstr :  deque(['a', 'b', 'c', 'd'])

# append() : 从右端添加元素,与list相同
dstr.append(4)
# dstr :  deque(['a', 'b', 'c', 'd', 4])

# appendleft() : 从左端添加元素
dstr.appendleft(3)
# dstr :  deque([3, 'a', 'b', 'c', 'd', 4])

# pop(): 移除列表中的一个元素(默认最右端的一个元素),并且返回该元素的值(与list同),如果没有元素,将会报出IndexError
# popleft():移除列表中的一个元素(默认最左端的一个元素),并且返回该元素的值,如果没有元素,将会报出IndexError
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
from collections import deque
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []
        queue = deque([root])
        result = []
        while queue:
            level = []
            size = len(queue)
            while size :
                cur = queue.popleft()
                level.append(cur.val)
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)
                size -= 1
            result.append(level)
        return result

相关题目:LeetCode:102、104、107、111(前面已完成)、116、117、199、429、515、637

226.翻转二叉树

leetcode题目链接
代码随想录文档讲解

题目描述:在这里插入图片描述

思路

其实就是两两交换节点的左右孩子。
想清楚这道题目应该用哪种遍历方式:递归(前、中、后序)?非递归?
本题使用前序或者后序最为方便。

伪代码(C++)

# 递归:递归三部曲
TreeNode* invertTree(root){
	if(root==NULL) return root;
	// 前序遍历 根左右
	swap(root->left, root->right);
	invertTree(root->left);
	invertTree(root->right);
}

python代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return root
        root.left, root.right = root.right, root.left
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root

101.对称二叉树

leetcode题目链接
代码随想录文档讲解

思路

不能判断左右孩子是否相等,应该判断根节点的左子树和右子树是否可以相互翻转,↑翻转二叉树。
其实比较的是外侧的节点是否相等,内侧的节点是否相等,如下图:
在这里插入图片描述
确定遍历顺序:只能使用后序遍历(左右根),因为要不断收集左右孩子的信息返回给上一个节点。

伪代码(C++)

bool compare(TreeNode* left, TreeNode* right){
	if(left==NULL && right!=NULL) return false;
	else if(left!=NULL && right==NULL) return false;
	else if(left==NULL && right==NULL) return true;
	else if(left->val != right->val) return false;
	bool outside = compare(left->left, right->right);
	bool inside = compare(left->right, right->left);
	return outside && inside
}

python代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        return self.compare(root.left, root.right)

    def compare(self, left, right):
        if(left == None and right != None):
            return False
        elif(left != None and right == None):
            return False
        elif(left == None and right == None):
            return True
        elif(left.val != right.val):
            return False
        outside = self.compare(left.left, right.right)
        inside = self.compare(left.right, right.left)
        return outside and inside

除此之外,也可使用迭代法(队列、栈都可)

相关推荐

  1. leetcode记录:02(思路篇)

    2024-06-18 09:52:04       33 阅读
  2. LeetCode笔记之

    2024-06-18 09:52:04       23 阅读
  3. LeetCode笔记之(一)

    2024-06-18 09:52:04       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-18 09:52:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-18 09:52:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-18 09:52:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-18 09:52:04       20 阅读

热门阅读

  1. Unity与Android交互通信系列(6)

    2024-06-18 09:52:04       4 阅读
  2. idea git stash报错Too many revisions specified

    2024-06-18 09:52:04       7 阅读
  3. 创建单例模式的六种方式

    2024-06-18 09:52:04       9 阅读
  4. jQuery 常用函数解析

    2024-06-18 09:52:04       7 阅读
  5. MVVM模式理解(基于Qt分析)

    2024-06-18 09:52:04       5 阅读
  6. 11 类型泛化

    2024-06-18 09:52:04       6 阅读
  7. 游戏服务器要注意哪些安全事项?

    2024-06-18 09:52:04       8 阅读