LeetCode226.翻转二叉树
1.问题
2.思路
整体思路是翻转每一个结点的左右孩子,所以需要遍历二叉树。则重点是以何种方式遍历二叉树!
前序、后序、层序都可以,中序不行,因为会把有的结点交换两次!
下以前序为例:
3.代码实现
(1)递归
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
//1.终止条件
if(root==NULL) return NULL;
//2.交换左右结点
TreeNode* tmp=root->left;
root->left=root->right;
root->right=tmp;
//3.遍历左右子树
invertTree(root->left);
invertTree(root->right);
return root;
}
};
注意:
交换节点的代码为:
TreeNode* tmp=root->left; root->left=root->right; root->right=tmp;
或者使用swap函数!!!
swap(root->left, root->right);
错误代码:
下面这样是不对的!
只交换了某两个节点的数值,而没有完全反转整棵子树!
TreeNode *tmpNode = new TreeNode();//创建新节点
tmpNode->val = root->right->val;//交换值
root->right->val = root->left->val;
root->left->val = tmpNode->val;
比如说第一步执行完,变成了如下图所示:
(2)迭代
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
stack<TreeNode*>st;
if(root == NULL) return root;
st.push(root);//根结点入栈!
while(!st.empty())//栈不为空时
{
TreeNode* node = st.top();//指针指向栈顶结点 //中
st.pop();//出栈
swap(node->left, node->right);
if(node->right) st.push(node->right);//右儿子入栈!(空节点不入栈)
if(node->left) st.push(node->left);//左儿子入栈!(空节点不入栈)
}
return root; //栈为空,结束
}
};