十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
大多数问题是函数名字写错 了。
创新互联专注于成都网站制作、网站设计、外贸网站建设、网页设计、网站制作、网站开发。公司秉持“客户至上,用心服务”的宗旨,从客户的利益和观点出发,让客户在网络营销中找到自己的驻足之地。尊重和关怀每一位客户,用严谨的态度对待客户,用专业的服务创造价值,成为客户值得信赖的朋友,为客户解除后顾之忧。
#includestdio.h
#includestdlib.h
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef char TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
Status CreateBitree(BiTree T);
Status PreOrder(BiTree T);
Status InOrder(BiTree T);
Status CreateBitree(BiTree T)
{
char ch;
scanf("%c",ch);
if(ch=='#')
T=NULL;
else{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T);
exit(OVERFLOW);
T-data=ch;
CreateBitree(T-lchild);
CreateBitree(T-rchild);
}
return OK;
}
Status PreOrder(BiTree T)
{
if(T){
printf("%c",T-data);
PreOrder(T-lchild);
PreOrder(T-rchild);
}
return OK;
}
Status InOrder(BiTree T)
{
if(T){
InOrder(T-lchild);
printf("%c",T-data);
InOrder(T-rchild);
}
return OK;
}
Status PostOder(BiTree T)
{
if(T){
PostOder(T-lchild);
PostOder(T-rchild);
printf("%c",T-data);
}
return OK;
}
int main()
{
BiTree T={'\0'};
printf("先序建树:依次输入二叉树结点号,孩子为空时输入空格\n");
CreateBitree(T);
printf("\n先序遍历二叉树为:");
PreOrder(T);
printf("\n中序遍历二叉树为:");
InOrder(T);
printf("\n后序遍历二叉树为:");
PostOder(T);
return 0;
}
#include iostream.h
typedef struct BiTNode
{
char data;
int bit;
struct BiTNode *lchild,*rchild,*parent;
}BiTNode;
void InitBT(BiTNode *t)//1、初始化,不带头结点
{
t=NULL;
}
/*void InitBT(BiTNode *t)//初始化,带头结点
{
t=new BiTNode;
t-lchild=t-rchild=t-parent=NULL;
}*/
int EmptyBT(BiTNode *t)//判断队空
{
if(t==0)
return 1;
else
return 0;
}
BiTNode *creatBT(BiTNode *t,int b)//2、创建二叉树
{
BiTNode *p;
char ch;
cinch;
if(ch=='#')return 0;
else
{
p=new BiTNode;
p-data=ch;
p-parent=t;
p-bit=b;
t=p;
t-lchild=creatBT(t,0);
t-rchild=creatBT(t,1);
}
return t;
}
void preorder(BiTNode *t)//3、先序遍历
{
if(!EmptyBT(t))
{
coutt-data;
preorder(t-lchild);
preorder(t-rchild);
}
}
void inorder(BiTNode *t)//中序遍历
{
if(!EmptyBT(t))
{
inorder(t-lchild);
coutt-data;
inorder(t-rchild);
}
}
void postorder(BiTNode *t)//后序遍历
{
if(!EmptyBT(t))
{
postorder(t-lchild);
postorder(t-rchild);
coutt-data;
}
}
void coutBT(BiTNode *t,int m,int n,int i)//4、计算二叉树中叶子结点、度为2的结点和度为1的结点的个数
{
if(!EmptyBT(t))
{
if((t-lchild==0) (t-rchild==0))
m++;//叶子结点
else if((t-lchild!=0) (t-rchild!=0))
i++;//度为2的结点
else
n++;//度为1的结点
coutBT(t-lchild,m,n,i);
coutBT(t-rchild,m,n,i);
}
}
void coutNode(BiTNode *t,int k)//5、求二叉树中结点个数
{
if(!EmptyBT(t))
{
k++;
coutNode(t-lchild,k);
coutNode(t-rchild,k);
}
}
int BTdepth(BiTNode *t)//6、求二叉树的深度
{
int i,j;
if(EmptyBT(t))
return 0;
else
{
i=BTdepth(t-lchild);
j=BTdepth(t-rchild);
return (ij?i:j)+1;
}
}
int Xdepth(BiTNode *t,char x)//7、查找x的层数
{
int num1,num2,n;
if(t==NULL)
return 0;
else{
if(t-data==x)
return 1;
num1=Xdepth(t-lchild,x);
num2=Xdepth(t-rchild,x);
n=num1+num2;
if(num1!=0||num2!=0)
n++;
return n;
}
}
static int flag;
void SearchChild(BiTNode *t,int k)//8、查找第k个结点的左右孩子
{
if(!EmptyBT(t))
{
if(k==0)
{
cout"位置不能为0!"endl;
return;
}
else
{
flag++;
if(flag==k)
{
if(t-lchild==0)
cout"无左孩子! ";
else
cout"左孩子为:"(t-lchild-data)" ";
if(t-rchild==0)
cout"无右孩子!"endl;
else
cout"右孩子为:"(t-rchild-data)endl;
}
else
{
SearchChild(t-lchild,k);
SearchChild(t-rchild,k);
}
}
}
}
int Xancestor(BiTNode *t,char x)//9、查找x结点祖先
{
int n,num1,num2;
if(t==NULL)
return 0;
else
{
if(t-data==x)
return 1;
num1=Xancestor(t-lchild,x);
num2=Xancestor(t-rchild,x);
n=num1+num2;
if(n!=0)
{
n++;
coutt-data" "endl;
}
}
}
void BTNodePath(BiTNode *t)//10、输出所有叶子结点路径
{
if(!EmptyBT(t))
{
if((t-lchild==0) (t-rchild==0))
{
coutt-data"的路径为:";
for(BiTNode *p=t;p!=0;p=p-parent)
coutp-data;
coutendl;
}
else
{
BTNodePath(t-lchild);
BTNodePath(t-rchild);
}
}
}
void BTNodebit(BiTNode *t)//11、输出所有叶子结点编码
{
if(!EmptyBT(t))
{
if((t-lchild==0) (t-rchild==0))
{
coutt-data"的编码为:";
for(BiTNode *p=t;p-parent!=0;p=p-parent)
coutp-bit;
coutendl;
}
else
{
BTNodebit(t-lchild);
BTNodebit(t-rchild);
}
}
}
void main()
{
BiTNode *t;
int m,n,i,d,q,k;
char x;
cout"1、初始化..."endl;
InitBT(t);
cout"2、创建二叉树..."endl;
t=creatBT(t,0);
cout"3.1、先序遍历..."endl;
preorder(t);
coutendl;
cout"3.2、中序遍历..."endl;
inorder(t);
coutendl;
cout"3.3、后序遍历..."endl;
postorder(t);
coutendl;
m=n=i=0;
cout"4、计算叶子结点,度为1的结点和度为2的结点的个数..."endl;
coutBT(t,m,n,i);
cout"叶子结点个数为:"mendl;
cout"度为1的结点个数为:"nendl;
cout"度为2的结点个数为:"iendl;
q=0;
cout"5、计算结点个数..."endl;
coutNode(t,q);
cout"结点个数为:"qendl;
d=0;
cout"6、计算深度..."endl;
d=BTdepth(t);
cout"深度为:"dendl;
cout"7、求x的层数..."endl;
cout"输入x:";
cinx;
if(Xdepth(t,x)==0)
cout"x不存在!"endl;
else
coutXdepth(t,x)endl;
cout"8、输入要查找孩子的结点在先序遍历中的位置k(不等于0):";
cink;
SearchChild(t,k);
if(kflag)
cout"位置超出长度!"endl;
cout"9、查询结点的所有祖先,请输入结点x:";
cinx;
int num;
num=Xancestor(t,x);
if(num==0)
cout"结点不存在!"endl;
if(num==1)
cout"根结点无祖先!"endl;
cout"10、输出所有叶子结点路径(叶→根):"endl;
BTNodePath(t);
cout"11、输出所有叶子结点编码(叶→根):"endl;
BTNodebit(t);
}
下面有一个建树的例子。
class TreeNode{
public:
TreeNode *left;
TreeNode *right;
int value;
TreeNode(int v): value(v)
{
left = NULL;
right = NULL;
}
~TreeNode() {
if (left != NULL) delete left;
if (right != NULL) delete right;
}
};
void addToTree(TreeNode *curr, TreeNode *p) {
if(p-value = curr-value) {
if(curr-left == NULL) {
curr-left = p;
return;
}
else addToTree(curr-left, p);
} else {
if(curr-right == NULL) {
curr-right = p;
return;
}
else addToTree(curr-right, p);
}
}
void printTree(TreeNode *p) {
if(p==NULL) return;
printTree(p-left);
printf("%d ", p-value);
printTree(p-right);
}
TreeNode * createBiTree(int[] a, int len)
{
TreeNode *root = new TreeNode(a[0]);
for(int i=1; i5; i++) {
TreeNode *p = new TreeNode(a[i]);
addToTree(root, p);
}
return root;
}
void main() {
int a[] = {3, 4, 1, 2, 5};
CreateBiTeee(a, 5);
printTree(root);
delete root;
}