注意:
构造二叉树的时候要用双重指针,用单重指针时,要有返回值。
代码如下:
/* 此处输入空格代表空,默认按前序遍历完全二叉树的方式输入数据 形参是在执行函数时自动分配的,没有执行这个函数之前不占用存 储空间,当函数执行完毕后释放这个形参,所以我们要使用到双重指 针来构造树。这样,我们传进去的是树节点的指针的指针,这样函数 执行完成后即使这个“指针的指针“被释放掉了,我们通过*T保存的树 结点的数据还是可以通过树节点的指针T来调用。相反,如果我们传 进去如果是树结点的指针,当这个函数执行完毕后,这个指针被销毁 了,而且CreateBiTree()函数不返回任何值,所以等于这个函数没有 被调用。 */ #include <stdio.h> #include <stdlib.h> typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNode *lchild; struct BiTNode *rchild; }BiTNode,*BiTree; typedef struct BiTNode *LinkTree; void CreateBiTree(BiTree *T) { char c; scanf("%c",&c); if(‘ ‘ == c) { (*T) = NULL; } else { (*T) = (LinkTree)malloc(sizeof(BiTNode)); (*T)->data = c; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } } void PreOrderTraverse(BiTree T,int level) { if(T) { printf("%c->",T->data); PreOrderTraverse(T->lchild,level+1); PreOrderTraverse(T->rchild,level+1); } } void InOrderTraverse(BiTree T,int level) { if(T) { InOrderTraverse(T->lchild,level+1); printf("%c->",T->data); InOrderTraverse(T->rchild,level+1); } } void PostOrderTraverse(BiTree T,int level) { if(T) { PostOrderTraverse(T->lchild,level+1); PostOrderTraverse(T->rchild,level+1); printf("%c->",T->data); } } int main() { int level = 1; BiTree T = NULL; CreateBiTree(&T); printf("前序遍历的结果为:\n"); PreOrderTraverse(T,level); printf("\n前序遍历的结果为:\n"); InOrderTraverse(T,level+1); printf("\n前序遍历的结果为:\n"); PostOrderTraverse(T,level); return 0; }
时间: 2025-01-04 20:53:58