一道很简单的题···然而我还是墨迹了半天
一看就可以知道 有递归和非递归的写法,不过在手写的时候依然把返回值给忘了,还把终止条件写错了。
递归的方法代码如下:
/**
* 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* invertTree(TreeNode* root) {
if(root==NULL) return NULL; //breaking statement need to be more clear
TreeNode* temp=root->left;
root->left=root->right;
root->right=temp;
invertTree(root->left);
invertTree(root->right);
return root; //didn't add return value
}
};
要注意是对root节点是否为空做判断,以便于判断程序是否终止。
另外,在invertTree函数中要有return root 节点的语句,用于得到转换后的树值。
(root是一个指针,指向了某一个treenode,因此会存在root就为空的情况,而且也要在最后返回root节点)
非递归的算法:
1、交换根节点的左右子节点
2、交换第二层每个节点的左右子节点
与二叉树层次遍历类似,代码如下:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==NULL) return NULL; //breaking statement need to be more clear
queue<TreeNode*> tree_queue; //queue
tree_queue.push(root);
while(tree_queue.size()>0){
TreeNode* head=tree_queue.front();
tree_queue.pop();
TreeNode* temp=head->left;
head->left=head->right;
head->right=temp;
if(head->right!=NULL)
tree_queue.push(head->right);
if(head->left!=NULL)
tree_queue.push(head->left);
}
return root;
}
};