力扣-翻转二叉树
Posted 只会C的码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣-翻转二叉树相关的知识,希望对你有一定的参考价值。
今天来看一道力扣翻转二叉树的题,做完这道题,你可以超越世界顶级程序员,哈哈哈,原因下面再说。(其实我做了,我照样被字节跳动面试官按在地上摩擦,终归是菜,不过唯一的收获是知道自己现在准备的事方向没偏,还有机会,两个月以后再战)。
下面先看看题目,翻转二叉树就是左右子树相互调换,翻转嘛,生活中很多例子,换个方向嘛。
趣闻科普:我要说的就是这个,这位大佬是开发的mac包管理器那么牛批,居然就是因为做不出这道题被谷歌拒绝,转身怒去了苹果公司,你做出来不就超越他了吗?是不是很自豪
大佬的软件介绍,还可以百度查询一下,应该用mac的小伙伴都深有体会吧。
下面我们看一下解题方法,主要三中,递归,迭代,还有就是层序遍历。
方法一:递归方法:自己调用自己
代码如下:
/**
* 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 == NULL)
{
return root;
}
//结点不为空的话就交换左右子树
swap(root->left,root->right); //交换左右子节点
invertTree(root->left);
invertTree(root->right);
return root;
}
};
方法二:迭代
//方法二:迭代法
TreeNode* invertTree(TreeNode* root) {
stack<TreeNode*>st;
if(root !=NULL)
{
st.push(root);
}
while(!st.empty())
{
TreeNode * node = st.top(); //取出栈顶结点
st.pop();
swap(node->left,node->right); //交换结点
if(node->left)
{
st.push(node->left);
}
if(node->right)
{
st.push(node->right);
}
}
return root;
方法三:层序遍历
//方法三:层序遍历
TreeNode* invertTree(TreeNode* root) {
queue<TreeNode *>que;
if(root!=NULL)
{
que.push(root);
}
while(!que.empty())
{
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;
我们再来看看效率,一看还是递归执行用时最短,速度最快,内存消耗的话都差不多,这些参数还跟电脑性能有关。
OK,今天这道题就到这里,你学到了吗?各位小伙伴早点休息。(明天研三的答辩了,距离毕业365天)
以上是关于力扣-翻转二叉树的主要内容,如果未能解决你的问题,请参考以下文章