通过字符串(括号表示法)创建一个二叉树(C语言实现)
   
写在前面:该篇文章参考文献:数据结构教程(第五版) 李春葆 主编
    
    
    实现步骤
   
    
     假设采用括号表示法表示的二叉树字符串
     
      str
     
     是正确的,用
     
      ch
     
     扫描str,其中只有四类字符,其处理如下。
    
   
- 单个字符:结点的值
- (:表示一棵子树的开始
- ):表示一棵子树的结束
- ,:表示一棵右子树的开始
    
    
    算法设计
   
- 
     先构造
 
 根结点N
 
 ,再构造
 
 左子树L
 
 ,最后构造
 
 右子树R
 
- 
     构造
 
 右子树R
 
 时,找不到N了,所以需要保存N
- 
     而括号(子树)是按照最近原则匹配的,所以使用一个
 
 栈
 
 保存N
    
     ch扫描采用括号表示法表示二叉树的字符串:
    
    
    
     A(B(D(,G)),C(E,F))
    
   
- 
     若ch=’
 
 (
 
 ’:表示前面刚创建的结点p存在孩子结点,需要将其进栈作为栈顶结点,并置空
 
 k=1
 
 ,表示开始处理左孩子结点;
- 
     若ch=’
 
 )
 
 ’:表示栈顶结点的左右孩子结点处理完毕,退栈;
- 
     若ch=’
 
 ,
 
 ’:表示开始处理右孩子结点,置
 
 k=2
 
 ;
- 
     其他情况(结点值):
 
 
 创建p
 
 结点用于存放ch
 
 当
 
 k=1
 
 时,将p作为栈顶元素的左孩子结点;
 
 当
 
 k=2
 
 时,将p作为栈顶元素的右孩子结点;
    
    
    源代码
   
头文件 btree.h
#pragma once
typedef char ElemType;
typedef struct node {
	ElemType data;		//数据元素
	struct node *lchild;	//指向左孩子的结点
	struct node *rchild;	//指向右孩子的结点
}BTNode;
函数实现 btree.cpp
#include<iostream>
#define MaxSize 20   //最大结点数
#include"btree.h"
void CreateBTree(BTNode *&b, char *str)
{
	BTNode *St[MaxSize], *p;   //St数组作为顺序栈,保存双亲结点
	int top = -1, k, i= 0;		//top为栈顶指针
	char ch;
	b = NULL;		//初始时二叉链为空
	ch = str[i];
	while (ch != '\0')		//循环处理,直到str中的每个字符扫描完毕
	{
		switch (ch)
		{
		case '(':top++; St[top] = p; k = 1; break;		//开始处理左孩子结点
		case ')':top--;  break;							//栈顶结点的子树处理完毕
		case ',': k = 2; break;							//开始处理右孩子结点
		default:
			p = (BTNode *)malloc(sizeof(BTNode));		//创建一个结点由p指向它
			p->data = ch;								//存放结点值
			p->lchild = p->rchild = NULL;				//左右指针都设置为空
			if (b == NULL)					//尚未设置根结点
				b = p;						//p作为根结点
			else
			{
				switch (k)
				{
				case 1:St[top]->lchild = p; break;		//新建结点作为栈顶结点的左孩子
				case 2:St[top]->rchild = p; break;		//新建结点作为栈顶结点的右孩子
				}
			}
		}
		i++;
		ch = str[i];
	}
}
    
    
    补充:关于二叉树的其他基本算法代码
   
/*销毁二叉树:释放二叉树b的所有结点分配的空间*/
void DestoryBTree(BTNode *&b) 
{
	if (b != NULL)
	{ 
		DestoryBTree(b->lchild);
	    DestoryBTree(b->rchild);
		free(b);
    }
}
/*查找结点:在二叉树b中查找值为x的结点,找到后返回其地址,否则返回NULL*/
BTNode *FindNode(BTNode *b, ElemType x)
{
	BTNode *p;
	if (b == NULL)
		return NULL;
	else if (b->data == x)
		return b;
	else 
	{
		p = FindNode(b->lchild, x);
		if (p != NULL)
			return p;
		else
			return FindNode(b->rchild, x);
	}
}
/*找孩子结点:直接返回结点p的左孩子或者右孩子地址*/
BTNode *LchildNode(BTNode *p)		//返回结点p的左孩子指针
{
	return p->lchild;
}
BTNode *RchildNode(BTNode *p)		//返回结点p的右孩子指针
{
	return p->rchild;
}
/*求二叉树的高度:返回二叉树的高度*/
int BTHeight(BTNode *b) 
{
	int lchildh, rchildh;
	if (b == NULL) return 0;		//空树高度为0
	else
	{
		lchildh = BTHeight(b->lchild);		//求左子树的高度
		rchildh = BTHeight(b->rchild);		//求右子树的高度
		return (lchildh > rchildh) ? (lchildh + 1) : (rchildh + 1);
	}
}
/*输出二叉树:输出创建二叉树时输入的字符串*/
void DispBTree(BTNode *b)
{
	if (b != NULL)
	{
		printf("%c", b->data);
		if (b->lchild != NULL || b->rchild != NULL)
		{
			printf("(");
			DispBTree(b->lchild);
			if (b->rchild != NULL)
				printf(",");
			DispBTree(b->rchild);
			printf(")");
		}
	}
}
 
版权声明:本文为sy15877882301原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
