剑指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);
}

相关内容

热门资讯

【MySQL】锁 锁 文章目录锁全局锁表级锁表锁元数据锁(MDL)意向锁AUTO-INC锁...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
数据分页展示逻辑 import java.util.Arrays;import java.util.List;impo...
Redis为什么选择单线程?R... 目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程?三、R...
【已解决】ERROR: Cou... 正确指令: pip install pyyaml
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
Lock 接口解读 前置知识点Synchronized synchronized 是 Java 中的关键字,...
Win7 专业版安装中文包、汉... 参考资料:http://www.metsky.com/archives/350.htm...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
大模型未来趋势 大模型是人工智能领域的重要发展趋势之一,未来有着广阔的应用前景和发展空间。以下是大模型未来的趋势和展...
python实战应用讲解-【n... 目录 如何在Python中计算残余的平方和 方法1:使用其Base公式 方法2:使用statsmod...
学习u-boot 需要了解的m... 一、常用函数 1. origin 函数 origin 函数的返回值就是变量来源。使用格式如下...
常用python爬虫库介绍与简... 通用 urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库&...
药品批准文号查询|药融云-中国... 药品批文是国家食品药品监督管理局(NMPA)对药品的审评和批准的证明文件...
【2023-03-22】SRS... 【2023-03-22】SRS推流搭配FFmpeg实现目标检测 说明: 外侧测试使用SRS播放器测...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
初级算法-哈希表 主要记录算法和数据结构学习笔记,新的一年更上一层楼! 初级算法-哈希表...
进程间通信【Linux】 1. 进程间通信 1.1 什么是进程间通信 在 Linux 系统中,进程间通信...
【Docker】P3 Dock... Docker数据卷、宿主机与挂载数据卷的概念及作用挂载宿主机配置数据卷挂载操作示例一个容器挂载多个目...