0
点赞
收藏
分享

微信扫一扫

树转换为二叉树

绪风 2022-05-03 阅读 82

利用左孩子右兄弟的思想,将第一个孩子置为二叉树的左孩子,将节点的右兄弟置为右孩子。

如下一棵树:

孟小起

转换为二叉树后应是:

孟小起

#include<iostream>
#include<string>
#include<new>
using namespace std;
#define MAXSIZE 100


typedef struct TreeNode{//左孩子右兄弟类型的二叉树结构体
	char data;
	struct TreeNode *child,*bro;
}*CSTree,CSNode;
void createCStree(CSTree &T,char vdata[],int degree[],int n){//将树创建成二叉树,将树T,各节点的值vdata,各节点的度degree和节点数n传参并返回树T
	CSTree pointer=new CSNode[MAXSIZE];//声明一个二叉树类型的节点数组
	int k=0,d;
	for(int i=0;i<n;i++){//初始化每个节点,并将左孩子和右兄弟置空
		pointer[i].data=vdata[i];
		pointer[i].child=pointer[i].bro=NULL;
	}
	for(int i=0;i<n;i++){               //遍历所有节点
		d=degree[i];                    //记录当前节点的度
		if(d){                          //度不为0时
			k++;						//指针k指向节点的第一个孩子
			pointer[i].child=&pointer[k];//将指针指向的节点赋给前节点的左孩子
			for(int j=2;j<=d;j++){		//用j去计数遍历前节点的孩子节点,也就是k节点兄弟结点
				k++;					//指针k指向k的右兄弟节点
				pointer[k-1].bro=&pointer[k];//将k的左兄弟的右兄弟指针指向k节点
			}
		}
	}
	T=&pointer[0];//T指向新构建的二叉树
}
void preputtree(CSTree T){//先序输出二叉树的节点,用栈的思想,递归
	
	if(T==NULL)return;
	
	else{						//先输出当前遍历到的节点,在递归调用左孩子,最后调用右兄弟
		
		printf("%c",T->data);
		
		preputtree(T->child);
				
		preputtree(T->bro);
		
	}
	
} 
int main(){
	CSTree T;
	char vdata[MAXSIZE];		//节点的值
	int degree[MAXSIZE];		//各节点的度
	int n;						//节点数目n
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>vdata[i]>>degree[i];
	}
	createCStree(T,vdata,degree,n);
	preputtree(T);
}


遇事不决,可问春风

举报

相关推荐

0 条评论