二叉树的最近公共祖先、两个最远节点、第K层结点个数、出现次数超过一半的元素
来源:互联网 发布:数控线切割编程视频 编辑:程序博客网 时间:2024/06/05 17:03
1.个结点的最近公共祖先
实现思路:保存两个节点的路径,然后进行判断相同根节点
typedef BNode TreeNode;bool GetNodePath(TreeNode* pHead, TreeNode* pNode, std::list<TreeNode*>&list){ //没有找到,就在就直接pop if (pHead == pNode) { return true; } list.push_back(pHead); bool found = false; //前序遍历 if (pHead->pLeft) { found = GetNodePath(pHead->pLeft, pNode, list); } if (!found&&pHead->pRight) { found = GetNodePath(pHead->pRight, pNode, list); } if (!found) { list.pop_back(); } return found;}//求最近公共祖先TreeNode* GetLastCommon ( const std::list<TreeNode*>&path1, const std::list<TreeNode*>&path2 ){ std::list<TreeNode*>::const_iterator it1 = path1.begin(); std::list<TreeNode*>::const_iterator it2 = path2.begin(); TreeNode* pLast = NULL; while (it1 != path1.end() && it2 != path2.end()) { if (*it1 == *it2) { pLast = *it1; } else { break; } it1++; it2++; } return pLast;}TreeNode* LastCommonParent(TreeNode*pHead, TreeNode* pNode1, TreeNode* pNode2){ if (pHead == NULL || pNode1 == NULL || pNode2 == NULL) { return NULL; } //获取两条路径 std::list<TreeNode*>path1; GetNodePath(pHead,pNode1,path1); std::list<TreeNode*>path2; GetNodePath(pHead, pNode2, path2); return GetLastCommon(path1,path2);}
2.最远两个结点的距离
实现思路:两个结点的最远距离,就是左右子树的高度之和,求最大值
从下往上求,后序遍历
size_t GetFarthestDistance(TreeNode* pHead,size_t&maxLength){ if (pHead == NULL) { return 0; } size_t left=GetFarthestDistance(pHead->pLeft,maxLength); size_t right=GetFarthestDistance(pHead->pRight,maxLength); if (left + right > maxLength) { maxLength = left + right; } return left > right ? left + 1 : right + 1;}
3.叶子节点的个数
思路:遍历一次树,当左右孩子均为空,说明就是叶子节点,进行计数
void _GetLeafCount(BNode* pRoot,size_t&count){ if (pRoot) { if (!(pRoot->pLeft) && !(pRoot->pRight)) { count++; } _GetLeafCount(pRoot->pLeft, count); _GetLeafCount(pRoot->pRight, count); }}
4.第K 层节点的个数
void _GetKthLeafCount(BNode* pRoot,size_t k,size_t K, size_t&count){ if (pRoot) { if (k==K) { count++; } k++; _GetKthLeafCount(pRoot->pLeft,k,K ,count); //注意此处是个坑,一次递归中不能++ 两次 _GetKthLeafCount(pRoot->pRight,k,K, count); }}
5.一个数组中有一个数字的次数超过了数组的一半,求出这个字符。如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2。
//思路1:用一个计数器,一个保存值,如果相等,则进行++,不相等进行–,等于-1时,进行更新改值
//思路2:用快速排序排序,中间元素即是该元素
size_t GetHalfTimesNum1(int* arr,size_t size){ if (arr == NULL || size < 1) { return 0; } int num = arr[0]; int count = 0; for (int i = 0; i < size; i++) { if (num == arr[i]) { count++; } else { count--; } if (count < 0) { num = arr[i]; } } return num;}size_t GetHalfTimesNum2(int* arr, size_t size){ sort(arr, arr + size); return arr[size/2];}
阅读全文
0 0
- 二叉树的最近公共祖先、两个最远节点、第K层结点个数、出现次数超过一半的元素
- 求二叉树的高度,叶子节点个数,第K层结点个数,求祖先结点问题
- 求二叉树叶子节点的个数/求二叉树第k层的节点个数/一个数组中有一个数字的次数超过了数组的一半,求出这个字符
- 求二叉树中两个节点的最近公共祖先结点
- day10之求二叉树叶子节点的个数+求二叉树第k层的节点个数+数组中超过一半的数字
- 二叉树中两个节点的最近公共祖先节点
- 二叉树中两个节点的最近公共祖先节点
- 二叉树中两个节点的最近公共祖先节点
- 二叉树中两个节点的最近公共祖先节点
- 求二叉树中两个结点的最近公共祖先
- 二叉树中找两个结点的最近的公共祖先结点
- 二叉树中找两个结点的最近公共祖先结点
- 二叉树中找两个结点的最近公共祖先结点
- 求二叉树中两个节点的最近公共祖先
- 求二叉树中两个节点的最近公共祖先
- 求二叉树中两个节点的最近公共祖先
- 求二叉树中两个节点的最近公共祖先
- 求二叉树中两个节点的最近公共祖先
- java中方法的参数传递机制
- HDU2612 BFS优化
- POJ3461-字符串匹配(基础)
- 宏EXPORT_SYMBOL在内核中的作用
- 15-Vue 之计算属性
- 二叉树的最近公共祖先、两个最远节点、第K层结点个数、出现次数超过一半的元素
- python assert 断言详细用法格式
- hdu1690 floyd
- 数据封装
- 石坑崆(猛坑石)攻略
- html5 标签
- 剑指offer 名企面试官精讲典型编程题pdf
- FZU 2256 树形dp(水)
- 非关系型数据库MongoDB