1.括号表示法构造一棵树
下面的代码都使用下面的图测试:
这颗树的前序遍历是
- [A,B,D,G,C,E,F,H]
为了程序的完整性,我想先构建一颗上述树,知识匮乏的我只能使用括号表示法构造:
- “A(B(,D(G,)),C(E,F(H,)))”
1.用一个类表示树的节点
class Node
{
public:
int val;
vector<Node*> children; //每个Node节点包含一个children数组,数组元素是Node*类型,表示指向其它的节点
//三个构造函数
Node() {
}
Node(int _val)
{
val = _val;
}
Node(int _val, vector<Node*> _children)
{
val = _val;
children = _children;
}
};
2.使用括号表示法构建树
void CreateTree(Node *&root,string &s)
{
stack<Node*>tree;
Node* p = NULL;
int i =0;
char ch = s[0];
while (i < s.length())
{
switch (ch)
{
case '(':
tree.push(p);
break;
case ')':
tree.pop();
break;
case ',':
break;
default:
p = new Node();
p->val = ch;
if (root == NULL) //没有加入根节点
{
root = p;
}
else
{
tree.top()->children.push_back(p);
}
}
ch = s[++i];
}
}
我觉得这个代码逻辑非常清晰,我想尝试一下用递归的方式完成上述代码。在此之前,我先介绍一下我现在对于构建二叉树的理解,我感觉这个难度不亚于用非递归写出树的前中后序遍历😋
个人见解:
对于S字符串分析,S=A(B(,D(G,)),C(E,F(H,)))。从头开始遍历,想要通过S字符串构建一颗树。
想要将问题给解决,必须找到字符串内在的联系并且将其具体化。发现,所有的括号都是配对出现的,且’(‘其配对的是最近的’)’。每次当遇到’(‘的时候,可以把新的问题具体成”构建一棵小树“(发现和最开始的问题是一个内在逻辑)。然后小树挂在大树身上
解释一下:
最开始的问题是构建A(B(,D(G,)),C(E,F(H,))) 这棵树。
遍历到B后面的’(‘的时候,问题变成构建B(,D(G,)),C(E,F(H,))这棵树,然后B挂在A身上
遍历到D后面的’(‘的时候,问题变成构建D(G,)这颗树。然后D挂在B身上
发现了实际上就是解决无数个这样的小问题最后解决大问题,而进入小问题的接口就是遇到’('。所以只需要能解决最简单的A(B,C)这个问题,那么后面无限的衍生都是一个道理。
问题即抽象为:
A ( B , C , D , E . . . . ) A(B,C,D,E....) A(