求二叉树中两节点的最近公共祖先

思路:最近公共祖先有一个好的特点,设AB两个节点的过最近公共祖先C,那么A,B必然在C的两支上。

程序:

#include <stdio.h> #include <stdlib.h> struct Node { const Node *left, *right; const char* name; Node(const Node *left, const Node *right, const char* name) :left(left), right(right), name(name) { } Node(const char* name) :left(NULL), right(NULL), name(name) { } }; const Node* LCA(const Node* root, const Node* a, const Node* b) { if(root == a) return a; if(root == b) return b; if(root == NULL) return NULL; const Node* llca = LCA(root->left, a, b); const Node* rlca = LCA(root->right, a, b); if(llca && rlca) return root; // 这就是我们要找的节点。 //否则返回我们得到的不是零的节点 if(llca) return llca; return rlca; } void preorder(const Node* root) { if (root == NULL) return; printf("%s ", root->name); preorder(root->left); preorder(root->right); return; } int main() { Node *a, *b, *e; Node *root = new Node(b=new Node(a=new Node("a"), e=new Node("e"), "b"), new Node("c"),"d"); printf("先序序列:/n"); preorder(root); printf("/na:%s,e:%s/n%s/n",a->name, e->name, LCA(root, a,e)->name); return 0; }

d

//

b  c

//

a  e

 

 

你可能感兴趣的:(求二叉树中两节点的最近公共祖先)