您的位置:首页 > 其它

二叉树的遍历(深度优先)

2016-02-01 12:11 375 查看

深度优先法、


这种方法基于递归的思想,先查看完一棵字数上的全部结点后再查看另一棵子树上的结点。按照对左子树、根结点、右子树的查看顺序,划分了4种不同的遍历顺序:先根顺序、后根顺序、左子树优先、右子树优先。


程序示例(先根顺序、左子树优先顺序)、

#include<stdio.h>
#include<stdlib.h>

struct TreeNode {
int val;
TreeNode *Left, *Right;
}; //建立二叉树结点数据类型。

TreeNode * insertTree(TreeNode * root, int val) { //想二叉树中添加新的结点。
TreeNode * newNode;
if(root == NULL) {
newNode = new TreeNode;
newNode -> val = val;
newNode -> Left = NULL;
newNode -> Right = NULL;
return newNode;
}
if(val <= root -> val)
root -> Left = insertTree(root -> Left, val) ;
else
root -> Right = insertTree(root -> Right, val);
return root;
}

void delTree(TreeNode * root) { //删除二叉树占用的存储空间。
if(root -> Left != NULL) delTree(root -> Left);
if(root -> Right != NULL) delTree(root -> Right);
delete root;
return;
}

void LFRTraverse(TreeNode * root) { //采用左子树优先的顺序遍历二叉树,每访问一个结点时,就输出该结点的值。
if(root -> Left != NULL) LFRTraverse(root -> Left);
printf("%d", root -> val);
if(root -> Right != NULL) LFRTraverse(root -> Right);
return;
}

void FLRTraverse(TreeNode * root) { //采用先根顺序遍历二叉树,每访问一个结点时,就输出该结点的值。
printf("%d", root -> val);
if(root -> Left != NULL) FLRTraverse(root -> Left);
if(root -> Right != NULL) FLRTraverse(root -> Right);
return;
}

int main()
{
FILE * fin;
TreeNode * root;
int val;
char inFile[30];
printf("input the data file's name: ");
scanf("%s", inFile);
fin = fopen("data.txt", "r"); //从输入文件中读入数据,建立一个二叉树。
root = NULL;
while(fscanf(fin, "%d", &val) != EOF) root = insertTree(root, val);
fclose(fin);
printf("traversing left sub - tree firstly, then root,  and right sub - tree lastly: \n");
LFRTraverse(root); printf("\n");
printf("traversing root firstly, then left sub - tree, and right sub - tree lastly: \n");
FLRTraverse(root); printf("\n");
delTree(root);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: