大问题变成小问题,不断迭代到可以进行判断,再返回判断结果。
判断两边:
首先判断两个根结点是否相同;
再判断左边根结点的左子树和右边根结点的右子树是否相同;
再判断左边根结点的右子树和右边根结点的左子树是否相同;
在判断是否相同时:
两个根结点均为 null,返回 true;
两个根结点中有一个是 null,有一个不是,返回 false;
两个根结点均不为 null,判断两个根结点的 val 值是否相同,再判断它们的左右子树。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root == NULL)
return true;
return mirror(root->left, root->right);
}
bool mirror(TreeNode* node1, TreeNode* node2){
if(node1 == NULL && node2 == NULL)
return true;
else if(node1 == NULL || node2 == NULL)
return false;
else
return (node1->val == node2->val)
&& mirror(node1->left, node2->right)
&& mirror(node1->right, node2->left);
}
};
层次遍历需要记录遍历到哪一层。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector> levelOrder(TreeNode* root) {
vector> ans;
levelorder(0, root, ans);
return ans;
}
void levelorder(int level, TreeNode* root, vector>& ans){
if(root == NULL)
return;
if(level >= ans.size()){
vector temp;
temp.push_back(root->val);
ans.push_back(temp);
}
else
ans[level].push_back(root->val);
levelorder(level+1, root->left, ans);
levelorder(level+1, root->right, ans);
}
};
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int ans = 0;
int maxDepth(TreeNode* root) {
dfs(1, root);
return ans;
}
void dfs(int depth, TreeNode* root){
if(root == NULL)
return;
ans = max(ans, depth);
dfs(depth+1, root->left);
dfs(depth+1, root->right);
}
};
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {
typedef pair depth;
int ans = 0;
stack nodes;
depth d(root, 1);
nodes.push(d);
while(!nodes.empty()){
depth temp = nodes.top();
nodes.pop();
if(temp.first != NULL){
ans = max(ans, temp.second);
depth l(temp.first->left, temp.second+1);
nodes.push(l);
depth r(temp.first->right, temp.second+1);
nodes.push(r);
}
}
return ans;
}
};
前序遍历的第一个值为该二叉树的根结点值。
根据得到的根结点值,可以在中序遍历中找到该根结点值的位置,由于中序遍历是先左子树,再根结点,再右子树,所以在中序遍历中,根结点的位置划分出来的左边为左子树,右边为右子树。
根据中序遍历中根结点的位置左边的元素个数,可以得到左子树的结点个数,根据左子树的结点个数可以在前序遍历中得到左子树的前序遍历和右子树的前序遍历。
此时确定了根结点、左子树和右子树,把左子树和右子树当成是独立的一棵二叉树继续递归,并且返回子树的根结点,作为此时(大二叉树)根结点的左子结点和右子结点,由此构造出整棵二叉树。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector& preorder, vector& inorder) {
if(preorder.empty())
return 0;
TreeNode* root = new TreeNode(preorder[0]);
int count = 0;
for(count = 0; count < inorder.size(); count++){
if(inorder[count] == preorder[0])
break;
}
vector pre1(preorder.begin()+1, preorder.begin()+1+count);
vector ino1(inorder.begin(), inorder.begin()+count);
vector pre2(preorder.begin()+1+count, preorder.end());
vector ino2(inorder.begin()+1+count, inorder.end());
root->left = buildTree(pre1, ino1);
root->right = buildTree(pre2, ino2);
return root;
}
};
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void flatten(TreeNode* root) {
while(root != NULL){
if(root->left == NULL)
root = root->right;
else{
TreeNode* r = root->left;
while(r->right != NULL)
r = r->right;
r->right = root->right;
root->right = root->left;
root->left = NULL;
}
}
}
};