二叉树建树

问题 h: 二叉树建树

题目描述

括号表示法表示的二叉树字符串 A(B(D,F(E,)),C(G(,H),I)),建立这棵树,并用先序遍历输出结果。

输入

无输入。

直接定义 char *str="A(B(D,F(E,)),C(G(,H),I))"

输出

输出 先序遍历的顺序

样例输出

ABDFECGHI

提示

若ch='(':表示前面刚创建的p结点存在着孩子结点,需将其进栈,以便建立它和其孩子结点的关系(如果一个结点刚创建完毕,其后一个字符不是'(',表示该结点是叶子结点,不需要进栈)。然后开始处理该结点的左孩子,因此置k=1,表示其后创建的结点将作为这个结点(栈顶结点)的左孩子结点;
若ch=')':表示以栈顶结点为根结点的子树创建完毕,将其退栈;
若ch=',':表示开始处理栈顶结点的右孩子结点,置k=2;

其他情况:只能是单个字符,表示要创建一个新结点p,根据k值建立p结点与栈顶结点之间的联系,当k=1时,表示p结点作为栈顶结点的左孩子结点,当k=2时,表示p结点作为栈顶结点的右孩子结点。

#include<iostream>
using namespace std;
struct BTNode
{
int data;
BTNode *lchild;
BTNode *rchild; 
};
BTNode*CreateBTNode(char *str)
{
 BTNode *r=NULL;
 BTNode *st[100000];
 BTNode *p;
 int top=-1,k=0,j=0;
 char ch;
 while(str[j]!='\0')
  {
     ch=str[j];
     switch(ch)
     {
        case'(':top++;st[top]=p;k=1;break;
        case')':top--;break;
        case ',':k=2;break;
        default:
        p=new BTNode();
        p->lchild=p->rchild=NULL;
        p->data=ch;
        if(r==NULL)
           r=p;
        else
        {
            switch(k)
            {
                case 1:st[top]->lchild=p;break;
                case 2:st[top]->rchild=p;break;
                default:break;
            }
        }
        break;
     }  
     j++;
  } 
  return r;
}
void DispBTNode1(BTNode *t)//递归先序遍历 
{
 if(t!=NULL)
 {
  printf("%c",t->data);
  DispBTNode1(t->lchild);
  DispBTNode1(t->rchild);
 }
}
int main()
{
 char *str="A(B(D,F(,E)),C(G(,H),I))";
 BTNode *bt=CreateBTNode(str);
 DispBTNode1(bt);
 return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_40729773/article/details/80753663
今日推荐