剑指Offer C++ --- 树
创始人
2025-06-01 08:13:04
0

1.BST树区间元素搜索问题

//寻找元素值在区间[i,j]的元素
//对于BST树而言,中序遍历由小到大排列
void findvalues(Node* root,vector&vec,int i,intj)
{if(root != nullptr){if(root->data > i){ findvalues(root->left,vec,i,j);}if(root->data >= i  && root->data <= j){vec.push_back(root->data);}if(root->data < j){findvalues(root->right,vec,i,j);}}
}

2. 判断一颗二叉树是不是BST树

思路:利用BST树中序遍历是一个升序的特点

bool isBSTree(Node* root,Node*& pre)
{if(node == nullptr){return true;}  //左子树if(!isBSTree(root->left,pre)){return false;}if(pre != nullptr && root->data < pre->data)        {return false;}pre = root;//右子树return isBSTree(root->right,pre);
}

3.判断BST树子树问题

bool isChildTree(Node* childroot)
{if(childroot == nullptr){return false;}Node* cur = childroot;while(cur!=nullptr){if(cur->data == childroot->data){break;}else if(cur->data < childroot->data){cur = cur->right;}else{cur = cur->left;}}if(cur != nullptr){return isChildTree(cur,childroot); }return false;
}bool isChildTress(Node* parent,Node* childroot)
{if(child == nullptr){return true;}if(parent == nullptr || parent->data != childroot->data ){return false;}return isChildTree(parent->left,childroot->left) && isChildTree(parent->right,childroot->right);
}

4.BST树最近公共祖先

TreeNode* lowestCommonAncestor(TreeNode* root,TreeNode* p,TreeNode* q)
{if(root == nullptr){return nullptr;}if(root->data < p->data && root->data < q->data){return lowestCommonAncestor(root->right,p,q);}else if(root->data > p->data && root->data > q->data){return lowestCommonAncestor(root->left,p,q);}else{return root;}return nullptr;
}

5.二叉树镜像对称问题

TreeNode* mirrorTree(TreeNode* root)
{if(root == nullptr){return nullptr;}TreeNode* tmp = root->left;root->left = root->right;root->right = tmp;mirrorTree(root->left);mirrorTree(root->right);return root;
}

6.对称的二叉树

bool isSymmetric(TreeNode* root) 
{if(root == nullptr){return true;}return isSymmetric(root->left,root->right);
}bool isSymmetric(TreeNode* node1,TreeNode* node2)
{if(node1 == nullptr && node2 == nulpptr){return true;}if(node1 == nullptr || node2 == nullptr){return false;}if(node1->val != node2->val){return false; }return isSymmeric(node1->left,node2->right) && isSymmeric(node1->right,node2->left);
}

7.根据前序遍历和后续遍历的序列重建二叉树

TreeNode* bulidTree(vector &perorder,vector &inorder)
{return rebulid(peroder,0,peroder.size()-1,inorder,0,inorder.size()-1);   
}TreeNode* rebuild(vector& perorder,int i,int j,vector& inorder,int m,int n)
{if(i>j || m>n){return nullptr;} //创建根节点,先序遍历的第一个结点就是根结点TreeNode* node = new TreNode(perorder[i]);for(int k = m;k<=n;++k){if(inorder[k] == perorder[i]){  //左子树node->left = rebulid(perorder,i+1,i+k-m,inorder,m,k-1);//右子树node->right = rebulid(perorder,i+k-m+1,j,inorder,k+1,n);return node;}}return node;
}

8.判断二叉树是不是平衡树

bool balance(TreeNode* root)
{if(root == nullptr){return true;}int h = 0;bool flag = true;balance(root,h,true);return flag;
}int balance(TreeNode* node,int h,bool & flag)
{if(node == nullptr){return h;}//左子树int left = balance(node->left,h+1,flag);if(!flag){return 0;}//右子树int right = balance(node->right,h+1,flag);if(!flag){return 0; }     if(abs(left-right) > 1)  //高度差大于1,失衡{flag = false;}return max(left,right);
}

9.BST树的第K大结点

中序遍历由小大排列,LVR

RVL,第K个元素就是第K大结点

int i = 0;
int KthLargest(TreeNode* root,int k)
{return getVal(root,k)->val;
}TreeNode* getVal(TreeNode* node,int k)
{if(node == nullptr){return nullptr;}//RTreeNode* right = getVal(node->right,k);if(right != nullptr){return right; }if(++i == k)     //V{return node;}//Lreturn getVal(node->left,k);
}

相关内容

热门资讯

安卓共有多少种系统,究竟有多少... 你有没有想过,安卓这个我们每天不离手的操作系统,竟然有那么多不同的版本呢?没错,安卓系统就像一个大家...
安卓系统怎么播放swf,And... 你有没有遇到过这种情况:手里拿着一部安卓手机,想看一个SWF格式的动画,结果发现怎么也打不开?别急,...
pos机安卓系统跟win系统,... 你有没有想过,那些在我们生活中默默无闻的POS机,竟然也有自己的操作系统呢?没错,就是安卓系统和Wi...
俄罗斯封禁安卓系统,本土化替代... 俄罗斯封禁安卓系统的背后:技术、经济与社会的影响在数字化浪潮席卷全球的今天,智能手机已成为我们生活中...
安卓系统总是弹出权限,安卓系统... 手机里的安卓系统是不是总爱和你玩捉迷藏?每次打开一个应用,它就跳出来问你要不要给它开权限,真是让人又...
安卓系统测血氧,便捷健康生活新... 你知道吗?现在科技的发展真是让人惊叹不已!手机,这个我们日常生活中不可或缺的小玩意儿,竟然也能变身成...
蓝光助手安卓系统的,深度解析与... 你有没有发现,现在手机屏幕越来越大,看视频、刷抖音,简直爽到飞起!但是,你知道吗?长时间盯着屏幕,尤...
安卓系统如何隐藏提示,Andr... 你是不是也和我一样,在使用安卓手机的时候,总是被那些弹出来的提示信息打扰到?别急,今天就来教你怎么巧...
安卓6.0系统如何分区,And... 你有没有想过,你的安卓手机里那些神秘的分区到底是怎么来的?别急,今天就来给你揭秘安卓6.0系统如何分...
安卓系统图片怎么涂鸦,指尖上的... 你有没有想过,在安卓系统的手机上,那些单调的图片也能变得生动有趣呢?没错,就是涂鸦!今天,就让我来带...
安卓系统40g,40GB存储空... 你有没有发现,最近你的安卓手机突然变得有点“胖”了呢?没错,就是那个传说中的40G!别急,别慌,今天...
安卓5.0系统怎么重置,轻松实... 手机用久了是不是感觉卡得要命?别急,今天就来教你怎么给安卓5.0系统来个彻底的重置,让它焕发新生!一...
安卓系统是不是快要,安卓系统即... 你有没有发现,最近安卓系统好像有点儿“不安分”了呢?是不是快要发生什么大事情?咱们一起来探个究竟吧!...
安卓6系统和8系统差别,全面对... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,安卓系统也跟着时代的步伐,从6系统一路升...
安卓11系统推荐下载,体验全新... 你有没有发现,最近手机界又掀起了一股热潮?没错,就是安卓11系统!这款全新的操作系统一经推出,就吸引...
原生安卓系统怎样升级,从基础到... 你有没有发现,你的安卓手机用久了,有时候就像老牛拉车一样,慢吞吞的?别急,今天就来给你支个招,让你的...
安卓13系统怎么开发,开发者的... 你有没有听说安卓13系统已经发布了?这可是个大新闻呢!作为一个热衷于手机开发的小伙伴,你是不是也跃跃...
安卓q系统镜像下载,轻松升级体... 你有没有听说安卓Q系统已经发布了?这可是安卓家族里的一大亮点呢!今天,我就要来给你详细介绍一下安卓Q...
安卓系统色彩校正软件,打造个性... 你有没有发现,手机屏幕的色彩有时候会让人感觉不太对劲?有时候,画面看起来有点灰蒙蒙的,有时候又太艳丽...
苹果能否下个安卓系统,开启新篇... 你有没有想过,苹果的iOS系统会不会有一天突然宣布,它要拥抱安卓的大家庭呢?想象iPhone和iPa...