226.翻转二叉树
题目:[https://leetcode-cn.com/problems/invert-binary-tree/description/]
思路:题目要求交换二叉树的左右叶子,直接遍历全树,交换左右节点即可
代码
class Solution {
public:
void invert(TreeNode* root) {
TreeNode *temp=NULL;
temp=root->right;//交换左右指针
root->right=root->left;
root->left=temp;
if (root->left!=NULL) {//左
invertTree(root->left);
}
if (root->right!=NULL) {//右
invertTree(root->right);
}
}
TreeNode* invertTree(TreeNode* root) {
if (root!=NULL) {
invert(root);
}
return root;
}
讨论区[https://leetcode.com/problems/invert-binary-tree/discuss/62731/Recursive-and-non-recursive-C++-both-4ms]
优秀范例代码
Recursive//递归
TreeNode* invertTree(TreeNode* root) {
if (root) {//后续遍历根节点,最后一个节点为根
invertTree(root->left);
invertTree(root->right);
std::swap(root->left, root->right);
}
return root;
}
Non-Recursive
TreeNode* invertTree(TreeNode* root) {
std::stack<TreeNode*> stk;//stl标准库stack适配器
stk.push(root);//入栈
while (!stk.empty()) {
TreeNode* p = stk.top();//返回栈顶
stk.pop();//出栈
if (p) {
stk.push(p->left);
stk.push(p->right);
std::swap(p->left, p->right);
}
}
return root;
}
总结与反思:1、二叉树:前序:最先访问根节点;中序:居中访问根节点;后序:最后访问根节点
2、NULL为空,(什么都没有!)。与0区别