二叉树c语言实现_LeetCode基础算法题第82篇:根据二叉树创建字符串

一直很纠结算法的文章应该怎么写。最后觉得还是从最简单的level开始写吧,一开始就弄些重量级的,什么人工智能,机器学习的算法,还要有大量的数学以及优化的知识,小白们估计会很郁闷,当然我也不一定能做出来对吧。

我计划每题给出两种语言的解决方案,一种静态语言,一种动态语言。

我选择C语言,Python和Java作为实现语言,由于篇幅有限,其他语言的实现有兴趣的朋友请自己尝试。

LeetCode 606. 根据二叉树创建字符串(Construct String from Binary Tree)

问题描述:

你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。

空节点则用一对空括号 "()" 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例:

d18aed6ab778e75b2222ca84703ea23c.png

C语言实现:

提到树的遍历,我们很容易想到递归。

我们就用递归来解这道题。

最终返回的字符串应当是"t.val + (左子树转换的字符串)+(左子树转换的字符串)"

而且按照题目的描述,还必须要满足一下情况:

  1. 当右子树是空时,原本的"()"应该被省略掉;
  2. 当左右子树都是空时,原本的"()()"应该被省略掉;
  3. 仅当左子树是空时,原本的"()"不能省略;

这样,这个算法就很容易写出来了。对于C语言来说唯一比较恶心的是,字符串的创建过程。

代码如下:

1786fd2208494ff46b0264937669f498.png

代码10行,如果当前是空节点,应该返回空字符串。。

代码13~17行,如果当前节点是一个叶子节点,那么直接将其值转换成字符串,并返回。

代码18行,返回左子树递归的结果。这个时候左子树的结果是不能省略的。

代码19~25行,返回右子树递归的结果的结果,注意右子树为空时,fmt,size都不包括考虑右子树。

代码26~27行,申请一段长度是size的字符串存放结果,并将结果保存到res中。

代码18~29行,注意释放掉期间动态分配的内存。

83f63a51054d87e4e018dfe0d9bd51f2.png

python语言的实现:

python 和C语言实现相同。

代码如下:

28fe8fdb0230dea68490808e3b258d7d.png
1a0101e27fa71fa4b5f8e73445e46aed.png

Java语言的实现:

Java的实现和C语言的实现原理相同。为了提高性能我们使用StringBuilder来存储字符。因此我们定义了一个辅助函数_tree2str来完成递归操作。

代码如下:

0532aa2862057b9bff1495a76c223baf.png
77ffc2f977c23154034c6a54271cad13.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值