给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]
把每一个节点的左右孩子交换一下就可以了。
采用递归方法,又是递归三部曲:
1、确定返回值类型TreeNode* invertTree(TreeNode*root)
2、确定终止条件,当当前节点时空的时候,就返回
3、确定单层循环的逻辑。先交换子节点,再交换子树
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;
//单层循环的逻辑
swap(root->left, root->right); //先交换左右孩子节点
invertTree(root->left); //翻转左子树
invertTree(root->right); //翻转右子树
return root;
}
};
二叉树主要有两种遍历方式:深度优先遍历:先往深处走,遇到叶子节点再往回走(前序遍历、中序遍历、后续遍历)迭代法、递归法。其次便是广度优先遍历:一层一层的去遍历
二叉树的递归遍历:
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec)
{
//确定终止条件
if (cur == NULL)return;
//确定单程循环的逻辑
vec.push_back(cur->val); //中间
if (cur->left)traversal(cur->left, vec); //左边
if (cur->right)traversal(cur->right, vec); //右边
}
vector<int>preorderTraversal(TreeNode* root)
{
vector<int>result;
traversal(root, result);
return result;
}
};
二叉树的迭代遍历
//迭代遍历
//确定迭代模型、建立迭代关系式、对迭代过程进行控制
class Solution {
public:
vector<int>preorderTraversal(TreeNode* root)
{
stack<TreeNode*>st;
vector<int>result;
if (root == NULL)return result;
st.push(root);
while (!st.empty())
{
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
if (node->right)st.push(node->right);
if (node->left)st.push(node->left);
}
}
};
//中序遍历左中右,先访问的时二叉树顶部的节点,然后一层一层向下访问,知道到达树左边的最底部,再开始处理节点(也就是把节点的数字放进result数组中)借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素
class Soulution
{
public:
vector<int>inorderTraversal(TreeNode* root)
{
vector<int>result;
stack<TreeNode*>st;
TreeNode* cur = root;
while (cur != NULL || !st.empty())
{
if (cur != NULL)
{
st.push(cur); //将访问的节点放进栈中
cur = cur->left; //一直到达左边树的最低端
}
else
{
cur = st.top(); //从栈中弹出的数据,就是要处理的数据,放进result数组中
st.pop();
result.push_back(cur->val); //中
cur = cur->right; //右
}
}
return result;
}
};