题目1:二叉搜索树的第k个节点

给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。

思路:因为是二叉搜索树,所以左中右的顺序遍历,第k个就是第k小的,用引用记录k的变换,k==0时就找到了第k小的节点

/*
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};
*/
class Solution {
public:TreeNode* findK(TreeNode* pRoot,int &k){TreeNode* ans = NULL ;if(pRoot->left!=NULL){ans = findK(pRoot->left,k) ;}k-- ;if(k==0&&ans==NULL){ans = pRoot ;}if(ans==NULL&&pRoot->right!=NULL){ans = findK(pRoot->right,k) ;}return ans ;}TreeNode* KthNode(TreeNode* pRoot, int k){if(pRoot == NULL || k == 0) return NULL;return findK(pRoot,k) ;}};

题目二:对称的二叉树

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路:要判断是不是镜像对称,就是判断左孩子和右孩子是否相等,然后递归他们的后代,记得递归时左右是镜像对应
/*
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};
*/
class Solution {
public:bool isTreeSymmertic(TreeNode* lRoot,TreeNode* rRoot){if(lRoot==NULL&&rRoot==NULL){return true ;}if(lRoot==NULL) return false ;if(rRoot==NULL) return false ;return (lRoot->val==rRoot->val)&&isTreeSymmertic(lRoot->left,rRoot->right)&&isTreeSymmertic(lRoot->right,rRoot->left) ;} bool isSymmetrical(TreeNode* pRoot){if(pRoot==NULL){return true ;}return isTreeSymmertic(pRoot->left,pRoot->right) ;}
};

题目三:二叉树的下一个结点

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

思路:主要考中序遍历,中序遍历时左-》中-》右,那么给定一个节点,它可以分成下面几种情况:

1、有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点;2、没有右子树,则判断该节点是否是其父节点的左孩子,如果是则其下一个要找的节点是其父节点;3、如果不是其父节点的左孩子,则把其父节点作为下一个遍历的节点,向上回溯,直到找到父节点没有父节点并且父节点是父节点的父节点的左孩子为止。综合这三种情况就可以找到二叉树中任意一个节点的下一个节点。

/*
struct TreeLinkNode {int val;struct TreeLinkNode *left;struct TreeLinkNode *right;struct TreeLinkNode *next;TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {}
};
*/
class Solution {
public:TreeLinkNode* find(TreeLinkNode* pNode){if(pNode->left!=NULL){return find(pNode->left) ;}else{return pNode ;}}TreeLinkNode* findFather(TreeLinkNode* pNode){TreeLinkNode* father ;if(pNode->next!=NULL){father = pNode->next ;}else{return NULL ;}if(father->left==pNode){return father ;}else{return findFather(father) ;}}TreeLinkNode* GetNext(TreeLinkNode* pNode){if(pNode==NULL){return pNode ;}if(pNode->right!=NULL){return find(pNode->right) ;}else{return findFather(pNode) ;}   }
};

转载于:https://www.cnblogs.com/maskmtj/p/9299502.html

c++刷题(18/100)树相关推荐

  1. leetcode刷题错误笔记(树之前)

    1.简单数据结构 1.1 数组一 二分查找: 看题目,数组升序,复杂度log n,想到二分查找. class Solution {public int search(int[] nums, int t ...

  2. LeetCode 刷题笔记 (树)

    1.  minimum-depth-of-binary-tree 题目描述 Given a binary tree, find its minimum depth.The minimum depth ...

  3. python 编程刷题_一起刷题吧 | 100+Python编程题带你快速上手(附答案)

    来源:Python大本营 本文约1000字,建议阅读5分钟. 100+编程练习帮大家轻松学习Python,春节也要抓紧学习哟~ 春节马上就要到了,怎么能让自己在假期里不掉队?今天,给大家准备一个项目: ...

  4. 【刷题日记】树的那些事儿(一)——基本操作

    树在面试中真的是一个出镜率异常高的数据结构了.而且和递归结合紧密,作为手撸代码的考察真是再合适不过. 所以就在这篇日记里不断更新树的一些概念和相应的题目吧~ 我的梦想是!一文在手!天下我有! 树的手撸 ...

  5. 卷上卷队——钟某人的python刷题day8——100道python例题

    今天的第一题~ 按相反的顺序输出列表的值 嗯,简简单单 a = [1,2,3] for i in a[::-1]:print(i) 第二题~ 按逗号分隔列表 题目没说清楚,我补充一下,是将列表输出,以 ...

  6. LeetCode刷题(100)~唯一摩尔斯密码词

    题目描述 国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: "a" 对应 ".-", "b" ...

  7. 面试刷题LeetCode经典100道

    准备面试刷题,100道经典LeetCode题目奉上. 题号 英文题名 中文题名 难度 likes 数 标签 1 Two Sum 两数之和 Easy 11712 数组,哈希表 2 Add Two Num ...

  8. 算法刷题路线总结与相关资料分享

    算法刷题路线总结与相关资料分享 前言 一.算法刷题路线总结 二.算法题刷题步骤 三.基础数据结构知识汇总 1.时间复杂度 2.空间复杂度 3.线性表 4.栈与队列 5.树 四.基础算法知识汇总 1.递 ...

  9. 2017-2018年度刷题记录

    2018暑假刷题1: T1.CF6A Triangle (#模拟 -1.4) T2.CF59A Word(#模拟 -1.5) T3.[洛谷]P2772 寻找平面上的极大点(#贪心 -1.4) T4.[ ...

  10. 深度优先搜索的概念原理、模板和leetcode刷题推荐(js)

    概念 深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 我的理解为:深度优先 ...

最新文章

  1. 也分享一个存储过程代码生成器 开源
  2. python哪些是可变对象_python的不可变对象与可变对象及其妙用与坑
  3. spring mvc 接入cas登录
  4. matlab nargout
  5. 浏览器到响应页面的全过程
  6. python3 bytes与hex字符串互转
  7. 汇编语言 ADC指令和SBB指令
  8. 计算机语言 angela,Angela
  9. jquery通过attr取html里自定义属性原来这么方便啊
  10. LeetCode 6071. 完成所有任务需要的最少轮数
  11. dpkg: 处理归档 /var/cache/apt/archives/libpng12-0_1.2.54-1ubuntu1.1_amd64.deb (--unpack)时出错: 无法安装 /lib/
  12. java hdu2011多项式求和
  13. 修改tomcat服务器图标,如何修改tomcat项目的图标(两种)
  14. android外接键盘,小米手机如何外接键盘
  15. 利用R语言进行具有周期性的时间序列分析
  16. 肽核酸(PNA)偶联穿膜肽(CCPs)(KFF)3K形成CCPs-PNA|肽核酸的使用方法
  17. 理论上 Android可以处理 多个手指的触摸
  18. 如何配置使用新的单线激光雷达
  19. 【阅读笔记】这本书可以让你戒烟
  20. Centos7下搭建DMHS(源端oracle目的端达梦,另附目的端oracle)

热门文章

  1. 关于 RGB 的颜色认知
  2. [转自李战博客]悟透JavaScript
  3. 项上的温柔,冬季围巾8大打法图解(组图)
  4. Flutter 页面托动按钮 DraggableFloatingActionButton
  5. Flutter PageView 属性使用详解
  6. 浏览器中的JavaScript
  7. input框内显示文字,输入时隐藏
  8. use 在php 用法中的总结
  9. BZOJ 3038 上帝造题的七分钟2
  10. 剑指offer系列14---合并两个升序链表