你需要采用前序遍历(根 左 右)的方式,将一棵二叉树转换成一个由括号和整数组成的字符串。空结点则用一对空括号“()”表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
例如:
思路: (1)从根节点开始向下判断,若根节点为空,直接返回;
(2)若根结点不为空则将根节点的值放进sb序列;
(3)再判断根节点的左孩子是否为空,若不为空则在sb序列中加入"(",使当前节点成为根结点,即递归自己(将t.left传进当前函数),将当前的根放进序列之后,继续判断当前根的左孩子是否为空,若为空就返回且在序列加上")",
(4)这样一直判断直到整个左子树判断完毕,右子树也是相似的方法即可。
图二的遍历思路: 根结点不为空,则先将1放进sb序列,若1.left不为空,就往序列里放进一个“(”,然后将1.left即2放进序列,然后判断2.left是否为空,2.left为空,就往序列里放进一个“( )”,再判断2.right,不为空就往序列里加“(”,再将4放进序列,继续判断4.left,4.right都为空就返回到上一个节点.,并往序列里添加一个“)”,从2返回到1也往序列里添加一个“)”,然后判断1.right,不为空时便往序列里添加“(”,然后将3放进序列,判断3.left,3.right是否为空,都为空就直接返回,再往序列里添加“)”,结束。
public class Tree{
private class Node{
int val;
Node left;
Node right;
public Node(int val) {
this.val = val;
}
}
//二叉树创建字符串
public void tree2strChild(Node t, StringBuffer sb) {
if(t==null){return; }
sb.append(t.val);//将根结点的值添加到此序列
if(t.left==null){//从这里判断的是根节点的左子树
if(t.right==null){
return;
}else{
sb.append("()");
}
}else{
sb.append("(");//当当前根节点的左不为空时,在序列里加个(
tree2strChild(t.left,sb);//调用自己的函数,相当于把自己的左孩子传进了函数,使左孩子成为当前的根结点
sb.append(")");//每递归一次就要将所有的语句都执行完,例如这一句,在这个地方可能会执行两次
}
if(t.right==null){//从这里判断的是根节点的右子树
return;
}else{
sb.append("(");
tree2strChild(t.right,sb);
sb.append(")");//每递归一次就要将所有的语句都执行完,例如这一句,在这个地方可能会执行两次
}
}
public String tree2str(Node t){
StringBuffer sb=new StringBuffer();
tree2strChild(t,sb);
return sb.toString();
}
}
//这篇代码是在力扣上跑过的故只有核心部分,主函数部分就不再呈现。