二叉树和广义表的转换

Posted NoviScl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树和广义表的转换相关的知识,希望对你有一定的参考价值。

  1 //广义表转二叉树:
  2 设置一个标记变量k,初始值为-1  3 设置一个标记结点p;
  4 循环遍历广义表的字符串str;
  5     如果str[i]是左括号:
  6         则设置k为0;
  7         把p压入栈中。
  8     否则如果str[i]是逗号:
  9         则设置k为1。
 10     否则如果str[i]是右括号:
 11         则栈顶元素出栈。
 12     否则如果str[i]是一个字母,用结点temp来存储:
 13         如果k为-1 14             则把temp作为根结点并压入栈中。
 15         如果k为0:
 16             如果此时栈顶结点是p,则先出栈;
 17             然后将temp作为栈顶结点的左孩子;
 18             再把temp压入栈中。
 19         如果k为1:
 20             栈顶元素出栈;
 21             将temp作为栈顶结点的右孩子;
 22             再把temp压入栈中。
 23 
 24 
 25 struct Node{
 26     char data;
 27     Node *lchild=NULL,*rchild=NULL;
 28 };
 29 
 30 typedef struct Node node;
 31 
 32 node* build(const string &str){
 33     node *root = NULL;
 34     unsigned long max_length=str.length();
 35     int k=-1;
 36     int top=-1;
 37     node *p;
 38     node *temp;
 39     node* Stack[max_length];
 40     for(int i=0;i<max_length;i++){
 41         if(str[i]==(){
 42             k=0;
 43             top++;
 44             Stack[top]=p;
 45         }
 46         else if(str[i]==,){
 47             k=1;
 48         }
 49         else if(str[i]==)){
 50             top--;
 51         }
 52         else if(isalpha(str[i])){
 53             temp=new node;
 54             temp->data=str[i];
 55             if(k==-1){
 56                 root=temp;
 57                 top++;
 58                 Stack[top]=temp;
 59             }
 60             else if(k==0){
 61                 if(Stack[top]==p){
 62                     top--;
 63                 }
 64                 Stack[top]->lchild=temp;
 65                 top++;
 66                 Stack[top]=temp;
 67             }
 68             else if(k==1){
 69                 top--;
 70                 Stack[top]->rchild=temp;
 71                 top++;
 72                 Stack[top]=temp;
 73             }
 74         }
 75     }
 76     return root;
 77 }
 78 
 79 
 80 
 81 
 82 //二叉树转广义表
 83 输出结点存储的值;
 84 如果左孩子不为空:
 85     输出"(" 86     递归输出左子树;
 87     如果右子树为空:
 88         输出",)" 89 如果右孩子不为空:
 90     如果左孩子为空:
 91         输出"(" 92     输出"," 93     递归输出右子树;
 94     输出")" 95 
 96 
 97 void print_list(node* cur_node){
 98     cout<<cur_node->data;
 99     if(cur_node->lchild!=NULL){
100         cout<<"(";
101         print_list(cur_node->lchild);
102         if(cur_node->rchild==NULL){
103             cout<<",)";
104         }
105     }
106     if(cur_node->rchild!=NULL){
107         if(cur_node->lchild==NULL){
108             cout<<"(";
109         }
110         cout<<",";
111         print_list(cur_node->rchild);
112         cout<<")";
113     }
114 }

 

以上是关于二叉树和广义表的转换的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习笔记——广义表树和二叉树的基本知识

数据结构学习笔记——广义表树和二叉树的基本知识

二叉树和哈希表的优缺点对比与选择

期末复习笔记——树和二叉树

基于二叉树和数组实现限制长度的最优Huffman编码

第四章 树和二叉树