本小白华中科技大学在读研究生,自然语言处理方向。现每日一更LeetCode Top 100 Liked Questions, 旨在于通过通俗易懂的画风和诸位计算机朋友们一起成长呀,不局限某题,争取举一反三,所有Questions均呈上C++和Java解法,不足之处多多指正,共同学习。
Example:
Input:
4
/ \
2 7
/ \ / \
1 3 6 9
Output:
4
/ \
7 2
/ \ / \
9 6 3 1
之前提到合并二叉树,根据二叉树的特性,大多是采用递归方法去解决每个节点的左右子树,因此本题也可以采用递归法依次交换左右子树。
解题思路一(递归法):
C++版本
TreeNode* invertTree(TreeNode* root) {
if(root != NULL){
//交换左右子树
TreeNode* node = root->left;
root->left = root->right;
root->right = node;
//递归左右子树
invertTree(root->left); //root->left = invertTree(root->left);
invertTree(root->right); //root->right = invertTree(root->right);
}
return root;
}
Java版本
public TreeNode invertTree(TreeNode root) {
if(root != null){
TreeNode node = root.left;
root.left = root.right;
root.right = node;
invertTree(root.left);
invertTree(root.right);
}
return root;
}
解题思路二(层序遍历法):
时间复杂度较高,因为多了入队、出队操作
TreeNode* invertTree(TreeNode* root) {
queue<TreeNode*> q; //层序遍历利用队列
if(!root){
return root;
}
q.push(root);
while(!q.empty()){
//交换左右子树
TreeNode* a = q.front();
q.pop();
TreeNode* node = a->left;
a->left = a->right;
a->right = node;
//非空左右子树入队列,依次操作,达到递归效果
if(a->left != NULL){
q.push(a->left);
}
if(a->right != NULL){
q.push(a->right);
}
}
return root;
}