• 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计算得出

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

  • 相关阅读:
    [编程题-网易]小易的升级之路
    [腾讯编程题]微信红包
    [编程题]生成格雷码
    [编程题]二叉树-网易
    安装wepack
    css选择器
    宽和高
    配置环境变量
    offsetLeft在各浏览器的值
    容易忘记的css属性和动画属性
  • 原文地址:https://www.cnblogs.com/nvbxmmd/p/4696231.html
Copyright © 2020-2023  润新知