代码随想录算法学习心得 13 | 102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树

一、二叉树的层序遍历

链接:力扣1

描述:给你二叉树的根节点 root ,返回其节点值的层序遍历。即逐层地,从左到右访问所有节点。

思路:需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

size指的是每一层的元素

代码如下:

		vector>result;
		queueq;
		if (root)
		{
			q.push(root);
		}
		while (!q.empty())
		{
			vectorv;
			int size = q.size();//这一层里有多少元素
			for (int i = 0; i < size; i++)
			{
				TreeNode* temp = q.front();
				q.pop();
				v.push_back(temp->val);
				if (temp->left)
				{
					q.push(temp->left);
				}
				if (temp->right)
				{
					q.push(temp->right);
				}
			}
			result.push_back(v);
		}
		return result;
	}

运行如下:

代码随想录算法学习心得 13 | 102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树_第1张图片


 

二、翻转二叉树

链接:力扣2

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

代码随想录算法学习心得 13 | 102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树_第2张图片

 思路:针对二叉树的问题,解题之前一定要想清楚究竟是前中后序遍历,还是层序遍历。

想要翻转它,其实就把每一个节点的左右孩子交换一下就可以了。

关键在于遍历顺序,前中后序应该选哪一种遍历顺序? 遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果

这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次。

也可以使用层序遍历

代码如下:

#include 
#include 
#include 
using namespace std;
struct TreeNode
{
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode() : val(0), left(nullptr), right(nullptr) {}
	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class Solution {
public:
	void invert(TreeNode* cur)
	{
		if (!cur)
		{
			return;
		}
		swap(cur->left, cur->right);
		invertTree(cur->left);
		invertTree(cur->right);
	}
	TreeNode* invertTree(TreeNode* root) 
	{
		this->invert(root);
		return root;
	}
};

运行如下:

代码随想录算法学习心得 13 | 102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树_第3张图片


 

三、对称二叉树

链接:力扣2

描述:给你一个二叉树的根节点 root , 检查它是否轴对称。

代码随想录算法学习心得 13 | 102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树_第4张图片

思路:

先判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。我们需要比较的是两个子树的里侧和外侧的元素是否相等。

本题遍历只能是“后序遍历”,因为要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。

代码如下:

#include 
using namespace std;
struct TreeNode
{
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode() : val(0), left(nullptr), right(nullptr) {}
	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class Solution 
{
public:
	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);
		bool result = outside && inside;
		return result;
	}
    bool isSymmetric(TreeNode* root) 
	{
		this->compare(root->left, root->right);
    }
};

运行如下:

代码随想录算法学习心得 13 | 102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树_第5张图片

你可能感兴趣的:(算法,数据结构,leetcode,c++)