二叉树入门简析
作者:互联网
给出一些二叉树的入门级(确信)使用方法:
1 //用递归的方式建立一个完全二叉树 2 void Bulid(int t){ 3 UpdateData(t); //添加数据 4 Build(t + t); //如果子节点存在 5 Build(t + t + 1); 6 //用这种方法建立非完全二叉树 会存在空间浪费的问题 7 } 8 9 //可以用数组下标模拟节点编号,用多个数组来记录节点信息 10 struct TreeNode1{ //可以存储一般二叉树 11 int value; //但是也会产生浪费的空间,具体用哪个就看情况了 12 int l,r,fa; 13 } a[100001]; 14 15 //也可以与链表类似,用指针存储二叉树的父节点&子节点 同时要记录根节点指针 16 struct TreeNode2{ 17 int value; 18 TreeNode2 *l,*r,*fa; 19 }; 20 TreeNode2 *root; 21 22 //以下就以指针操作来简介二叉树的基本操作 23 24 //新建节点 25 struct TreeNode{ 26 int value; 27 TreeNode *l, *r, *fa; //初始为NULL 28 TreeNode(int x){ value = x;} 29 } 30 TreeNode *p = new TreeNode(x); 31 32 //根节点初始化 33 TreeNode *root; 34 root = new TreeNode(v); 35 36 //删除节点(暂空) 37 38 //插入子节点 39 void Insert(TreeNode *fa, TreeNode *p,int flag){ 40 //flag = 0 插入到左边 41 //flag = 1 插入到右边 42 if (!flag){ 43 fa->l = p; 44 } 45 else{ 46 fa->r = p; 47 } 48 p->fa = fa; 49 } 50 51 TreeNode *p = new TreeNode(v); 52 Insert(fa,p,flag); 53 54 55 //二叉树的遍历顺序(先序遍历、中序遍历、后序遍历)<-以根节点的访问时间作为区分 56 57 //先序遍历(DLR) 58 void PreOrder(TreeNode *p){ 59 cout << p->value << endl; 60 if (p->l) PreOrder(p->l); 61 if (p->r) PreOrder(p->r); 62 } 63 Pre Order(root); 64 65 //中序遍历(LDR) 66 void InOrder(TreeNode *p){ 67 if (p->l) InOrder(p->l); 68 cout << p->value << endl; 69 if (p->r) InOrder(p->r); 70 } 71 InOrder(root); 72 73 //后序遍历(LRD) 74 void PostOrder(TreeNode *p){ 75 if (p->l) PostOrder(p->l); 76 if (p->r) PostOrder(p->r); 77 cout << p->value << endl; 78 } 79 PostOrder(root); 80 81 //层级遍历(BFS序列)(基于队列) 82 TreeNode *q[N]; 83 void BFS(TreeNode *root){ 84 int front = 1, rear = 1; 85 q[1] = root; 86 while (front <= rear){ 87 TreeNode *p = q[front]; 88 front++; 89 cout << p->value << endl; 90 if (p->l) q[++rear] = p->l; 91 if (p->r) q[++rear] = p->r; 92 } 93 } 94 BFS(root); 95 96 //要实现计算每个节点的深度也不难 97 //root->d = 1; 每次++时p->l/r->d=p->d+1;
标签:TreeNode,入门,value,fa,简析,二叉树,root,节点 来源: https://www.cnblogs.com/Conqueror712/p/16103303.html