题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
题解:
class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { /** 注意p,q必然存在树内, 且所有节点的值唯一!!! 递归思想, 对以root为根的(子)树进行查找p和q, 如果root == null || p || q 直接返回root 表示对于当前树的查找已经完毕, 否则对左右子树进行查找, 根据左右子树的返回值判断: 1. 左右子树的返回值都不为null, 由于值唯一左右子树的返回值就是p和q, 此时root为LCA 2. 如果左右子树返回值只有一个不为null, 说明只有p和q存在与左或右子树中, 最先找到的那个节点为LCA 3. 左右子树返回值均为null, p和q均不在树中, 返回null **/ if(root == null || root == p || root == q) return root; TreeNode left = lowestCommonAncestor(root.left, p, q); TreeNode right = lowestCommonAncestor(root.right, p, q); if(left == null && right == null) return null; else if(left != null && right != null) return root; else return left == null ? right : left; } }
例外的题解就是打印从跟节点到 p 和 q的路径,然后求最近公共祖先。
2、 二叉搜索树中第K小的元素
题解: 中序遍历
#include <stack> using std::stack; class Solution { public: int kthSmallest(TreeNode* root, int k) { //use stack stack<TreeNode*> stk; int count = 0; TreeNode *p = root; while(p || !stk.empty()) { if(p) { stk.push(p); p = p->left; } else { count++; p = stk.top(); if(count >= k) { return p->val; } p = p->right; stk.pop(); } } return p->val; } };