二叉树的建立、删除及三种遍历的C++实现
教材上的Tree类写法太累赘,不实用,将树节点直接写成结构体即可
要理解结点的含义以及根结点的重要意义
- #include <stdio.h>
- #include <stdlib.h>
- //用CPP文件编写,否则编译出错,需要加struct且delete不识别
- struct TreeNode {
- int val;
- TreeNode * left, * right;
- };
- TreeNode * insertTree(TreeNode * root,int val){//insert new node,return root
- 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 FLRTraverse(TreeNode * root) {//先序遍历
- printf("%d/n",root -> val);
- if(root -> left != NULL) FLRTraverse(root -> left);
- if(root -> right != NULL) FLRTraverse(root -> right);
- return;
- }
- void LFRTraverse(TreeNode * root) {//中序遍历
- if(root -> left != NULL) LFRTraverse(root -> left);
- printf("%d/n",root -> val);
- if(root -> right != NULL) LFRTraverse(root -> right);
- return;
- }
- void LRFTraverse(TreeNode * root) {//后序遍历
- if(root -> left != NULL) LRFTraverse(root -> left);
- if(root -> right != NULL) LRFTraverse(root -> right);
- printf("%d/n",root -> val);
- return;
- }
- void main(){
- //始终记住根是对树而言最重要的结点
- FILE * fin;
- TreeNode *root;
- int val;
- fin = fopen("data.txt","r");
- root = NULL;
- while(fscanf(fin,"%d",&val) != EOF) root = insertTree(root,val);
- fclose(fin);
- printf("先序遍历:/n");
- FLRTraverse(root);
- printf("/n");
- printf("中序遍历:/n");
- LFRTraverse(root);
- printf("/n");
- printf("后序遍历:/n");
- LRFTraverse(root);
- printf("/n");
- delTree(root);
- return;
- }
- http://blog.youkuaiyun.com/yangliuy/article/details/6012802