LeetCode根据二叉树创建字符串&&二叉树的构建以及遍历(递归)
Posted 小锦鲤yaw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode根据二叉树创建字符串&&二叉树的构建以及遍历(递归)相关的知识,希望对你有一定的参考价值。
目录
606. 根据二叉树创建字符串
给你二叉树的根节点 root
,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。
空节点使用一对空括号对 "()"
表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
示例 1:
输入:root = [1,2,3,4] 输出:"1(2(4))(3)" 解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。
示例 2:
输入:root = [1,2,3,null,4] 输出:"1(2()(4))(3)" 解释:和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。
提示:
- 树中节点的数目范围是
[1, 104]
-1000 <= Node.val <= 1000
思路分析:
我们需要先判断根节点是否为空,如果根节点为空,直接输出一个空字符串即可
如果根节点不为空,那么我们判断左子树,左边不为空,加入左边的值
否则左边为空,此时需要判断右边是否为空,右边不为空,则左边需要一个空括号用来占位
最后我们在判断右子树即可
代码展示:
class Solution
StringBuilder sb = new StringBuilder();
public String tree2str(TreeNode root)
//root为空返回空字符串
if(root == null)
return "";
//添加根结点的值
sb.append(root.val);
//左边不为空,加入左边的值
if(root.left != null)
sb.append("(");
tree2str(root.left);
sb.append(")");
//否则左边为空,此时需要判断右边是否为空
else
//右边不为空,则左边需要一个空括号用来占位
if(root.right != null)
sb.append("()");
//右边不为空,加入右边的值
if(root.right != null)
sb.append("(");
tree2str(root.right);
sb.append(")");
return sb.toString();
二叉树的构建以及遍历
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:
输入包括1行字符串,长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。
示例1
输入:
abc##de#g##f###复制输出:
c b e g d f a
思路分析:
二叉树的建立:用一个下标遍历字符串,如果下标超过字符串的长度,则返回null,
如果遇到了"#",也返回空,上面两个都判断过后,此时说明下标没有越界并且也不为空,此时将值传入root节点,然后先接收左子树,在接受右子树
代码展示:
import java.util.Scanner;
public class Main
private static class Node
char val;
Node left;
Node right;
public Node(char val)
this.val = val;
public static void main(String[] args)
Scanner in = new Scanner(System.in);
while (in.hasNextLine())
String str = in.nextLine();
Node root = buildTree(str);
inOrder(root);
System.out.println();
private static int index;
//根据字符串建立二叉树
private static Node buildTree(String str)
if(index >= str.length())
return null;
if(str.charAt(index) == '#')
index++;
return null;
char c = str.charAt(index);
Node root = new Node(c);
index++;
root.left = buildTree(str);
root.right = buildTree(str);
return root;
//中序遍历
private static void inOrder(Node root)
if(root == null)
return;
inOrder(root.left);
System.out.print(root.val + " ");
inOrder(root.right);
LeetCode 606 根据二叉树创建字符串[二叉树 dfs] HERODING的LeetCode之路
解题思路:
一道变型的二叉树前序遍历,加上了模拟的思想,根据条件进行判断,分为左右两节点都在、左节点在和右节点在三个条件,根据情况插入双括号,代码如下:
/**
* 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
private:
string ans;
public:
string tree2str(TreeNode* root)
dfs(root);
return ans;
void dfs(TreeNode* node)
if(node == nullptr) return;
ans += to_string(node->val);
// 左右子树都在
if(node->left != nullptr && node->right != nullptr)
ans += '(';
dfs(node->left);
ans += ")(";
dfs(node->right);
ans += ')';
// 只有左子树在
if(node->left != nullptr && node->right == nullptr)
ans += '(';
dfs(node->left);
ans += ')';
// 只有右子树在
if(node->left == nullptr && node->right != nullptr)
ans += "()(";
dfs(node->right);
ans += ')';
;
以上是关于LeetCode根据二叉树创建字符串&&二叉树的构建以及遍历(递归)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Algorithm 606. 根据二叉树创建字符串