题目:
有一颗树,给定树中任意两个结点,计算出这两个结点的最近公共祖先(查看定义)。 树结点的定义为(请不要在代码中再次定义该结构): C/C++ struct TreeNode { TreeNode *parent; } Java public class TreeNode { public TreeNode parent; } 树结点只包含父结点指针(父结点指针为null表示该结点为根结点),该题存在空间复杂度O(1),时间复杂度低于O(n)的简单算法。
代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LCA { class Program { static void Main(string[] args) { } public int GetHeight(TreeNode treeNode) { int height = 1; while (treeNode.parent!=null) { height++; treeNode = treeNode.parent; } return height; } public TreeNode GetLCA(TreeNode node1, TreeNode node2) { int height1 = GetHeight(node1); int height2 = GetHeight(node2); while (height1>height2) { node1 = node1.parent; height1--; } while (height1<height2) { node2 = node2.parent; height2--; } while (node1!=node2) { node1 = node1.parent; node2 = node2.parent; } return node1; } } public struct TreeNode { public TreeNode parent; } }