博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode:Invert Binary Tree
阅读量:5907 次
发布时间:2019-06-19

本文共 2999 字,大约阅读时间需要 9 分钟。

Invert a binary tree.

4   /   \  2     7 / \   / \1   3 6   9

to

4   /   \  7     2 / \   / \9   6 3   1 即反转二叉树,代码如下:
/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {        //在每一层将节点的左孩子和右孩子分别交换即可,直到节点没有孩子(递归recursion)public:    TreeNode* invertTree(TreeNode* root) {        TreeNode *temp;        if(root)        {            temp = root->right;            root->right = invertTree(root->left);            root->left  = invertTree(temp);        }        return root;    }};

  或者:

class Solution {public:    TreeNode* invertTree(TreeNode* root) {        if (root) {            root->left = invertTree(root->left), root->right = invertTree(root->right);            std::swap(root->left, root->right);        }        return root;    }};

  其他解法:

1、C++ using queue, 0ms

非递归版本,做广度优先处理,使用一个队列来保存当前水平未处理的非空节点。每次,切换前节点的左,右指针,将其弹出,并添加它的非空孩子到队列中。

class Solution {public:TreeNode* invertTree(TreeNode* root) {      if (root==nullptr) return nullptr;    queue
st; st.push(root); while(!st.empty()){ TreeNode* n=st.front(); st.pop(); if (n->left!=NULL) st.push(n->left); if (n->right!=NULL) st.push(n->right); swap(n->left,n->right); } return root; }};

  

2、先前序遍历这棵树的每个结点,如果遍历到的结点有子节点,就交换他的两个子节点,当交换完所有非叶子节点的左右子节点之后,就得到了该二叉树的镜像。

class Solution {public:     TreeNode* invertTree(TreeNode* root) {         if(root==null){            return null;        }        if(root->left==null&&root->right==null){            return root;        }        TreeNode *temp = root->left;        root->left = root->right;        root->right = temp;        if(root->left!=null){            invertTree(root->left);        }        if(root->right!=null){            invertTree(root->right);        }        return root;    }};

  显示出错:‘null’ was not declared in this scope

将null改为nullptr就 了:

class Solution {public:TreeNode* invertTree(TreeNode* root) {         if(root==nullptr){            return nullptr;        }        if(root->left==nullptr&&root->right==nullptr){            return root;        }        TreeNode *temp = root->left;        root->left = root->right;        root->right = temp;        if(root->left!=nullptr){            invertTree(root->left);        }        if(root->right!=nullptr){            invertTree(root->right);        }        return root;    }};

:从1972年C语言刚刚诞生以来,常数0就扮演着整数(int)0和空指针( null pointer )两种角色。为了避免理解上的二义性,C语言通常使用NULL宏来表示空指针,NULL宏通常被定义为(void *)0或0, 而C++仅仅采用0来表示空指针,这样存在一个问题:比如对于重载函数 fun(char *) 和 fun(int) 的调用来说,若直接用NULL作为参数调用fun(NULL),我们可能认为NULL作为空指针的表示,应该调用 fun(char *) 函数,然而NULL实际上的值为0,就会调用  fun(int) 。 nullptr 关键字正是为了解决这一问题而产生的。

nullptr 能够转换成任何指针类型(包括成员函数指针和成员变量指针)和bool类型(这是为了兼容普通指针都能使用 if(ptr) 判断是否为空指针的形式),但是不能被转换为整数0。 

(更多了解可参考:http://blog.csdn.net/huang_xw/article/details/8764346)

 

转载于:https://www.cnblogs.com/carsonzhu/p/4580308.html

你可能感兴趣的文章
Linux安装配置ftp服务器
查看>>
radmin注册密码
查看>>
枫叶防注入程序漏洞
查看>>
AAA基础知识
查看>>
LG Display携手宝岛眼镜 不闪式3D亲民的新尝试
查看>>
mac下idea的使用之svn篇--有图超详细
查看>>
LACP和STP
查看>>
Docker管理工具Web UI:DockerUI & Shipyard
查看>>
OSSEC 加固linux系统详细配置
查看>>
CCNA配置试验之四 OSPF协议的配置
查看>>
RSA算法加解密示例
查看>>
分享一个消息组件
查看>>
kali系统网络设置
查看>>
[MySQL Reference Manual] 23 Performance Schema结构
查看>>
字符串大小写转换
查看>>
Silverlight游戏开发:引擎"Night"解析
查看>>
Asp.net中利用ExecuteNonQuery()执行存储过程返回-1解决方案
查看>>
【探索PowerShell 】【十三】WMI对象
查看>>
部署Symantec_Endpoint_Protection_11.0.4202
查看>>
IPSEC over GRE 同时NAT-T
查看>>