zoukankan      html  css  js  c++  java
  • 235 Lowest Common Ancestor of a Binary Search Tree

      Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.

    According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

            _______6______
           /              
        ___2__          ___8__
       /              /      
       0      _4       7       9
             /  
             3   5
    

    For example, the lowest common ancestor (LCA) of nodes 2 and 8 is 6. Another example is LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.

    /**
    * Definition for a binary tree node.
    * struct TreeNode {
    * int val;
    * TreeNode *left;
    * TreeNode *right;
    * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    * };
    */

    /**********编写下面代码的时候我还不了解二叉搜索树的特点,以下代码对于任何二叉树均适用,关于二叉搜索树的知识将转载到数据结构分类中*********/

    方法一:编写函数找到两个节点的根路径,存储在两个vector里,再通过遍历vector找到相同的最后面一个元素

     1 class Solution {
     2 public:
     3     bool TraceNode(TreeNode* root, TreeNode* p, vector<TreeNode*>& vec) {
     4         if(!root) {
     5             return false;
     6         }
     7         vec.push_back(root);
     8         if(root == p) {
     9             return true;
    10         }
    11         if(!TraceNode(root->left, p, vec)) {
    12             if(root->left != NULL) {
    13                 vec.pop_back();
    14             }
    15             if(!TraceNode(root->right, p, vec)) {
    16                 if(root->right != NULL) {
    17                     vec.pop_back();
    18                 }
    19                 return false;
    20             } else {
    21                 return true;
    22             }
    23         } else {
    24             return true;
    25         }
    26     }
    27     TreeNode* GetlowestCommonEle(vector<TreeNode*> vec1, vector<TreeNode*> vec2) {
    28         for(int i = vec1.size() - 1; i >= 0; i--) {
    29             for(int j = vec2.size() - 1; j >= i; j--) {
    30                 if(vec1[i] == vec2[j]) {
    31                     return vec1[i];
    32                 }
    33             }
    34         }
    35     }
    36     TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    37           TraceNode(root, p, vec1);
    38           TraceNode(root, q, vec2);
    39           if(vec1.size() < vec2.size()) {
    40               return GetlowestCommonEle(vec1, vec2);
    41           } else {
    42               return GetlowestCommonEle(vec2, vec1);
    43           }
    44     }
    45 private:
    46     vector<TreeNode*> vec1;
    47     vector<TreeNode*> vec2;
    48 };

    方法二:把二叉树以固定格式存储在vector中,每个元素的parent可以根据vector的index计算得出

    目前运行时出现错误,在家里没有好的调试环境,过两天修改好再更新

  • 相关阅读:
    Android研究之游戏开发处理按键的响应
    C语言指针的初始化和赋值
    Cloudera CDH 5集群搭建(yum 方式)
    未将对象引用设置到对象的实例--可能出现的问题总结
    内存泄漏以及常见的解决方法
    都能看懂的嵌入式linux/android alsa_aplay alsa_amixer命令行使用方法
    Life is hard!
    EasyUI基础入门之Resiable(可缩放)
    Android -- Looper.prepare()和Looper.loop() —深入版
    vi 命令 使用方法
  • 原文地址:https://www.cnblogs.com/nvbxmmd/p/4696231.html
Copyright © 2011-2022 走看看