前言
热闹不过是短暂的消耗品,而撑起你人生的是孤独本身
一、翻转二叉树
观察可以发现,如要翻转整个二叉树,就在遍历的过程中去翻转每⼀个节点的左右孩⼦就可以达到整体翻转的效果。
二、打法
1、递归法
1、确定递归函数的参数和返回值
参数就是要传⼊节点的指针,返回值题⽬中给出要返回root节点的指针,所以函数的返回类型为TreeNode*。
2、确定终⽌条件
当前节点为空的时候,就返回
3、确定单层递归的逻辑
因为是先做前序遍历,所以先进⾏交换左右孩⼦节点,然后反转左⼦树,反转右⼦树。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==nullptr) return root;
swap(root->left,root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
};
2、迭代法-深度优先遍历1(前序遍历)
classSolution{
public:
TreeNode* invertTree(TreeNode*root){
if(root==NULL) return root;
stack<TreeNode*> st;
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;
}
};
3、迭代法-深度优先遍历2(前序遍历.标记法)
class Solution{
public:
TreeNode* invertTree(TreeNode*root) {
stack<TreeNode*>st;
if(root!=NULL) st.push(root);
while(!st.empty())
{
TreeNode* node=st.top();
if(node!=NULL) {
st.pop();
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
st.push(node);
st.push(NULL);
}else{
st.pop();
node=st.top();
st.pop();
swap(node->left,node->right);
}
}
return root;
}
};
4、迭代法-广度优先遍历(层序遍历)
classSolution{
public:
TreeNode*invertTree(TreeNode*root) {
queue<TreeNode*> que;
if(root!=nullptr) que.push(root);
while(!que.empty())
{
int size=que.size();
for(int ii=0;ii<size;ii++)
{
TreeNode* node=que.front();
que.pop();
swap(node->left,node->right);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return root;
}
};