找树中两个节点的最近公共祖先

 
 
  1. /*查找a,b的最近公共祖先,root为根节点,out为最近公共祖先的指针地址*/   
  2. int  FindNCA(Node* root, Node* a, Node* b, Node** out)   
  3. {   
  4.     if ( root == null )   
  5.     {   
  6.         return  0;   
  7.     }  
  8.   
  9.     if ( root == a || root == b )  
  10.     {      
  11.         return  1;  
  12.     }  
  13.   
  14.     int  iLeft = find(root->left, a, b, out);  
  15.     if ( iLeft == 2 )  
  16.     {      
  17.         return  2;  
  18.     }  
  19.   
  20.     int  iRight = find(root->right, a, b, out);  
  21.     if ( iRight == 2 )  
  22.     {      
  23.         return  2;  
  24.     }  
  25.   
  26.     if ( iLeft + iRight == 2 )  
  27.     {     
  28.         *out == root;  
  29.     }  
  30.     return  iLeft + iRight;  
  31. }  
  32.   
  33. void  main()   
  34. {   
  35.     Node* root = ...;   
  36.     Node* a = ...;   
  37.     Node* b = ...;   
  38.     Node* out = null;   
  39.     int  i = FindNCA(root, a, b, &out);   
  40.     if ( i == 2 )   
  41.     {   
  42.         printf("Result pointer is %p" , out);   
  43.     }   
  44.     else    
  45.     {   
  46.         printf("Not find pointer" );   
  47.     }   



#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
->
left
,
a
,
b
);


   

if
(
llca
&&
rlca
)

return
root
;

// 这就是我们要找的节点。




   

// 否则返回我们得到的不是零的节点


   

if
(
llca
)

return
llca
;


   

return
rlca
;



}





int
main
()



{


   

Node

*
a
,

*
b
;


   

Node

*
root
=

new

Node
(
new

Node
(
a
=

new

Node
(
"a"
),
NULL
,
"b"
),
b
=

new

Node
(
"c"
),
"d"
);


    printf

(
"%s/n"
,
LCA
(
root
,
a
,
b
)->
name
);


   

return

0
;



}



http://fayaa.com/tiku/view/160/


你可能感兴趣的:(c,null)