二叉树最近公共父节点

来源:互联网 发布:mac老是弹出垃圾网站 编辑:程序博客网 时间:2024/06/07 23:09
#include <bits/stdc++.h>using namespace std;struct TreeNode{    int val;    TreeNode*left;    TreeNode*right;    TreeNode(int x):        val(x),left(NULL),right(NULL) {}};int k;int x,y;void create(TreeNode*root,int n){    if(n==0)return;    root->left=new TreeNode(root->val-pow(2,n-1));    root->right=new TreeNode(root->val+pow(2,n-1));    create(root->left,n-1);    create(root->right,n-1);}//针对二叉排序树TreeNode*findTreeNode(TreeNode*root,int n){    if(root->val==n)return root;    else if(root->val<n)return findTreeNode(root->right,n);    else findTreeNode(root->left,n);}//方法一:针对所有二叉树结构,复杂度较高TreeNode*findCommonParent(TreeNode*root,TreeNode*p,TreeNode*q){    if(root==NULL||p==root||q==root)return root;    TreeNode*leftNode=findCommonParent(root->left,p,q);    TreeNode*rightNode=findCommonParent(root->right,p,q);    if(leftNode&&rightNode)return root;    else if(leftNode)return leftNode;    else return rightNode;}//方法二:针对二叉树平排序结构,复杂度较低TreeNode*findCommonParent1(TreeNode*root,TreeNode*p,TreeNode*q){    int min,max;    if(p->val<q->val)min=p->val,max=q->val;    else min=q->val,max=p->val;    while(root)    {        if(root->val>=min&&root->val<=max)return root;        else if(root->val<min&&root->val<max)root=root->right;        else root=root->left;    }    return NULL;}int main(){    while(cin>>k>>x>>y)    {        TreeNode*root=new TreeNode(pow(2,k-1));        create(root,k);        TreeNode*p=findTreeNode(root,x);        TreeNode*q=findTreeNode(root,y);        TreeNode*commonParent=findCommonParent(root,p,q);        cout<<"方法一:"<<commonParent->val<<endl;        TreeNode*commonParent1=findCommonParent1(root,p,q);        cout<<"方法二:"<<commonParent1->val<<endl;    }    return 0;}