一、题目描述
传送门:226. 翻转二叉树
描述:
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例:
输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]
输入:root = [2,1,3] 输出:[2,3,1]
二、思路
采用先序遍历(或者是后序遍历)的方式,每当访问子树的根节点时候,交换左右节点,然后再访问左子树和右子树,再次交换各个子树中的左右子树即可。遍历方式可以选择递归或者迭代。
递归遍历二叉树可以使用递归实现:递归的实现是栈,每一次的递归调用会把函数的局部变量等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,这样就可以实现从底向上一层一层的进行返回了。
因此,也可以使用栈(stack)实现进行迭代的遍历(本题中先后序均可)。
以下给出了两种方式的代码以及相关注释。
三、代码
递归法 (C++):
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
invert(root);
return root;
}
void invert(TreeNode* root) {
if(root) {
swap(root -> left, root -> right); // 根
invert(root -> left); // 左
invert(root -> right); // 右
}
}
};
递归法 (C++):
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
stack<TreeNode*> st; // 栈
if(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;
}
};