102.二叉树的层序遍历
题目:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
辅助队列:需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
vector<vector<int>> ans;
if(root==nullptr) return ans;
que.push(root);
while(!que.empty()){
int cursize=que.size();//记录当前层有几个节点
vector<int> temp;
for(int i=0;i<cursize;++i){
TreeNode* cur=que.front();
que.pop();
temp.push_back(cur->val);
if(cur->left) que.push(cur->left);
if(cur->right) que.push(cur->right);
}
ans.push_back(temp);
}
return ans;
}
};
递归法:用depth记录树高
class Solution {
public:
void order(TreeNode* cur, vector<vector<int>>& result, int depth)
{
if (cur == nullptr) return;
if (result.size() == depth) result.push_back(vector<int>());
result[depth].push_back(cur->val);
order(cur->left, result, depth + 1);
order(cur->right, result, depth + 1);
}
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
int depth = 0;
order(root, result, depth);
return result;
}
};
226.翻转二叉树
题目:翻转一棵二叉树。
递归法:把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果。此题注意不能使用中序,因为左中右的顺序会导致翻转两次。
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==nullptr) return root;
swap(root->left,root->right);//先序
invertTree(root->left);
invertTree(root->right);
return root;
}
};
迭代法:用一个栈模拟先序遍历
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==nullptr) return root;
stack<TreeNode*> stk;
stk.push(root);
while(!stk.empty()){
TreeNode* cur=stk.top();
stk.pop();
swap(cur->left,cur->right);
if(cur->left) stk.push(cur->left);
if(cur->right) stk.push(cur->right);
}
return root;
}
};
101. 对称二叉树
题目:给定一个二叉树,检查它是否是镜像对称的。
对称二叉树是要比较两个左右子树都相等。
节点为空的情况有:
(1)左节点空,右节点不为空,不对称,return false
(2)左不为空,右为空,不对称 return false左右都为空,对称,返回true
(3)左右都不为空,比较节点数值,不相同就return false
class Solution {
public:
bool compare(TreeNode* left,TreeNode* right){
if(left!=nullptr&&right==nullptr) return false;
else if(left==nullptr&&right!=nullptr) return false;
else if(left==nullptr&&right==nullptr) return true;
else if(left->val!=right->val) return false;
//判断是否对称
bool c1=compare(left->left,right->right);
bool c2=compare(left->right,right->left);
return c1&&c2;
}
bool isSymmetric(TreeNode* root) {
if(root==nullptr) return root;
return compare(root->left,root->right);
}
};
相关题目:
572.另一棵树的子树
给你两棵二叉树
root
和subRoot
。检验root
中是否包含和subRoot
具有相同结构和节点值的子树。如果存在,返回true
;否则,返回false
。二叉树
tree
的一棵子树包括tree
的某个节点和这个节点的所有后代节点。tree
也可以看做它自身的一棵子树。
此题考查了如何判断两棵树是否是完全相同的两棵树,然后先序遍历root树进行依次比对,只要找到一个满足条件的 节点就返回true
class Solution {
public:
bool isSame(TreeNode* p,TreeNode* q){
//判断两棵树是否相等
if(p==nullptr&&q!=nullptr) return false;
else if(p!=nullptr&&q==nullptr) return false;
else if(p==nullptr&&q==nullptr) return true;
if(p->val!=q->val) return false;
bool s1=isSame(p->left,q->left);
bool s2=isSame(p->right,q->right);
return s1&&s2;
}
bool isSubtree(TreeNode* root, TreeNode* subRoot) {
if(root==nullptr&&subRoot==nullptr) return true;
else if(root==nullptr&&subRoot!=nullptr) return false;
//先序进行判断
if(isSame(root,subRoot)) return true;
bool s1=isSubtree(root->left,subRoot);
bool s2=isSubtree(root->right,subRoot);
return s1||s2;//只要存在即可
}
};