//此种方式先翻转叶节点,自底向上
TreeNode* invertTree(TreeNode* root) {
if(!root)
return root;
TreeNode* left = invertTree(root->left);
TreeNode* right = invertTree(root->right);
root->left = right;
root->right = left;
return root;
}
//此种方式自上而下,先翻转root的左右节点,然后再翻转下面的节点
TreeNode* invertTree(TreeNode* root) {
if(!root)
return root;
TreeNode *temp = root->left;
root->left = root->right;
root->right = temp;
invertTree(root->left);
invertTree(root->right);
return root;
}
非递归的思想:先将根入栈,然后出栈时对当前出栈的节点进行左右节点交换,然后进行压栈(如果不为空的话),核心思想:有点像层次遍历,采用队列也可以实现
TreeNode* invertTree(TreeNode* root) {
TreeNode* stack[50],*p;
int top = -1;
if(root){
stack[++top] = root;
while(top>-1){
p = stack[top--];
//进行交换操作
TreeNode* temp = p->left;
p->left = p->right;
p->right = temp;
//将交换后的非空节点入栈
if(p->left)
stack[++top] = p->left;
if(p->right)
stack[++top] = p->right;
}
}
return root;
}
前两个为参考别人的代码,第三个为自己写的,执行效率差了点