计算二叉排序树两个结点间的结点数
来源:互联网 发布:皇室战争烈焰精灵数据 编辑:程序博客网 时间:2024/05/16 09:35
13、在一棵高度为O(logn)的二叉排序树的结点上存储着浮点数,请用C语言写一个函数来计算一棵树上界于任意俩个浮点数x1和x2 (x1<x2)之间的结点数。说明你的算法的计算复杂度,算法计算复杂度越低越好。这个题我扩展到更一般情况,可求二叉树两个结点间的结点数。(或者求二叉树两个结点间的路径,或者求二叉树两个结点的最近公共祖先)
#include<iostream>#include<cstdlib>using namespace std;typedef struct BTNode{ int data; struct BTNode *lchild; struct BTNode *rchild;}BTNode;//二叉排序树插入结点int BSTInsert(BTNode * &p, int num){ if(p == NULL) { p = (BTNode*)malloc(sizeof(BTNode)); p->data = num; p->lchild = p->rchild = NULL; return 1; }else { if(p->data == num) return 0; else if(num < p->data) return BSTInsert(p->lchild, num); else return BSTInsert(p->rchild, num); }}//找到根节点到指定num结点的路径 path里存的是路径 count是数组长度,即路径长度int find_print(BTNode *p, int num, int path[], int level, int &count){ if(p!=NULL) { path[level-1] = p->data; if(num == p->data) { count = level; return 1; } if(find_print(p->lchild, num, path, level+1, count)) return 1; return find_print(p->rchild, num, path, level+1, count); }else{ return 0; }}//打印路径void show_arr(int a[], int len){ int i; for(i=0; i<len; ++i) cout<<a[i]<<" "; cout<<endl;}int main(){ int arr[] = {12, 15, 5, 9, 3, 49, 25, 66, 19, 21}; BTNode *root=NULL; int i, len=sizeof(arr)/sizeof(arr[0]); for(i=0; i<len; ++i) { BSTInsert(root, arr[i]); } int path1[len], path2[len]; int cout1, cout2; find_print(root, 3, path1, 1, cout1); find_print(root, 21, path2, 1, cout2); //打印根结点到3的路径 show_arr(path1, cout1); //打印根结点到21的路径 show_arr(path2, cout2); //找到最近的公共祖先 for(i=0; i<cout1 && i<cout2; ++i) if(path1[i] != path2[i]) break; //因为i指向的是最近公共祖先的数组下标,实际长度应该i+1 //++i; int result = cout1-i+cout2-i+1; 和下面是等价的 int result = cout1-i+cout2-i-1; cout<<"结果为:"<<result<<endl; return 0;}
0 0
- 计算二叉排序树两个结点间的结点数
- 计算有向无环图中两个结点的路径数C++
- 二叉排序树的结点删除
- 完全二叉树的结点数计算
- 求两个链表结点组成的数之和
- 平衡二叉排序树插入结点的学习总结
- 二叉排序树删除值小于value的结点
- 二叉排序树的建立、结点插入及删除
- 二叉排序树的第k个结点
- 求结点数位n的 二叉排序树个数
- 计算二叉树中所有结点数的算法
- 计算二叉树中分支结点数的算法
- 计算二叉树中双分支结点数的算法
- 计算二叉树中叶子结点数的算法
- 计算二叉树的高度和结点数
- 计算二叉树的高度和结点数
- 1019_计算二叉树的高度和结点数
- 计算二叉树的高度和结点数
- 在路上前行的小牛
- vector
- 网络流(Network Flow)
- Problem F: 质心算法
- 3月8日,ScrollPanel,每日20行。
- 计算二叉排序树两个结点间的结点数
- [Unity]console中定位lua文件并在sublime中打开
- 【BZOJ 4726】【POI 2017】[动态规划]Sabota?
- 【hdoj_1250】Hat's Fibonacci(大数)
- [Audacity][编译][步骤二]audacity编译步骤
- JS 篇(2)
- Coin Change
- Java 集合系列之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)
- 《ACM程序设计》-Problem O-找出最多颜色