面试题:判断二叉树是否对称 && 按层打印二叉树

1,判断二叉树是否对称

题目解析:二叉树对称的意思就是和它的镜像二叉树一样,,就类似于下面这样

struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
		val(x), left(NULL), right(NULL) {
	}
};

class Solution {
public:
	bool isSymmetrical(TreeNode* pRoot)
	{
		if (pRoot == NULL)
			return true;
		return  _isSymmetrical(pRoot->left, pRoot->right);
		
	}

	bool _isSymmetrical(TreeNode * left, TreeNode* right)
	{
		if (left == NULL)//如果左边为空,去看右边,都为空返回true,否则返回false
			return right == NULL;
		if (right == NULL)//这时左边不为空,但是右边是空,那就直接返回假
			return false;
		if (left->val != right->val)//看看左右两边的值是不是一样,不一样就返回值假了
			return false;
		//将左节点的左孩子和右节点的右孩子进行比较,将左节点的右孩子和右节点的左孩子比较
		return _isSymmetrical(left->left, right->right) && _isSymmetrical(left->right, right->left);
	}

};

2,按层打印二叉树

解题思路:

每次将树的一层入队列,然后将这一层节点全部出队列,并同时将每个元素的值入vector,同时将每个元素的左右节点入队列。

#include<queue>
#include<vector>
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
		val(x), left(NULL), right(NULL) {
	}
};

class Solution {
public:
	vector<vector<int> > Print(TreeNode* pRoot) {
		//1,判空
				//要先建立一个大vector要不然没法返回
		vector<vector<int>> V;
		if (pRoot == NULL)
			return V;
		//2,创建大vector 和小vector 和 queue
		vector<int> v;
		queue<TreeNode*> q;
		TreeNode* pCur = NULL;
		//3,非递归层序遍历
		q.push(pRoot);
		while (!q.empty())
		{
			int size = q.size();//队列有几个元素就出几次队列,处理一层
			for (int i = 0; i < size; i++)
			{
				pCur = q.front();
				q.pop();
				if (pCur->left)
					q.push(pCur->left);
				if (pCur->right)
					q.push(pCur->right);
				v.push_back(pCur->val);
			}
			V.push_back(v);
			v.clear();
		}
		return V;
	}

};

猜你喜欢

转载自blog.csdn.net/wm12345645/article/details/81661660