二叉树的建立与遍历

来源:互联网 发布:html js 格式化工具 编辑:程序博客网 时间:2024/04/29 12:16

二叉树的建立的遍历的一个最主要思想就是递归

建立一个二叉树,实质就是以每一个结点为根结点,建立他的子树

遍历也是一样,都是以子树为单位 

上代码

#include<stdio.h>#include<stdlib.h>//ab#d##c#e##//                  a//               b     c//             #   d  #  e//                # #   #  #struct Node{    char data;    struct Node* left;    struct Node* right;};Node* CreatTree(){    Node* root;<span style="white-space:pre"></span>//思考一下为什么我要定义定义成指针    char ch;    scanf("%c",&ch);    if(ch=='#')        root= NULL;    else    {        root=(Node*)malloc(sizeof(Node));        root->data=ch;        root->left=CreatTree();        root->right=CreatTree();    }    return root;}void DLR(Node *root)//先序遍历{    if(root)    {        printf("%c",root->data);        DLR(root->left);        DLR(root->right);    }}void LDR(Node *root)//中序遍历{    if(root)    {        LDR(root->left);        printf("%c",root->data);        LDR(root->right);    }}void LRD(Node *root)//后序遍历{    if(root)    {        LRD(root->left);        LRD(root->right);        printf("%c",root->data);    }}int main(){    Node *root=CreatTree();//还有这儿,也是指针    DLR(root);    printf("\n");    LDR(root);    printf("\n");    LRD(root);    printf("\n");    return 0;}

定义成指针

1,在建立树的函数CreateTree()里,是为了方便返回值,想一想如果就定义成Node型,该怎么返回值

2,定义成指针,还是具有Node型的变量data,而且方便函数参数的传进去,不然,需要考虑值传递啊什么什么的

我上一个麻烦点的二叉树建立吧

#include <stdio.h>#include <stdlib.h>//By ZWRen //ab#d##c#e##  //                  a//               b     c//             #   d  #  e//                # #   #  #struct Node{char data;Node* left;Node* right;};void CreatTree(Node* root){ //Error这个是错的,思考下为什么错了char ch;scanf("%c",&ch);if(ch == '#') root = NULL;else{root = (Node*)malloc(sizeof(Node));root->data = ch;creatTree(root->left);creatTree(root->left);}}void CreatTree2(Node** root){//OK这个是对的,但是好麻烦有木有char ch;scanf("%c",&ch);if(ch == '#') *root = NULL;else{*root = (Node*)malloc(sizeof(Node));(*root)->data = ch;creatTree2(&((*root)->left));creatTree2(&((*root)->right));}}void DLR(Node* root){//先序遍历if(root == NULL) return;printf("%c",root->data);DLR(root->left);DLR(root->right);}int main(){Node* root;CreatTree2(&root);DLR(root);printf("\n");return 0;}

因为你在CreatTree里申请的内存,是通过malloc在堆中申请,你传进去的地址在函数里被重新赋值了

自己好好想想吧,其实是我自己说不明白。

0 0
原创粉丝点击