剑指offer————(面试题50)获取任意节点的公共父节点

来源:互联网 发布:淘宝开店代销怎么赚钱 编辑:程序博客网 时间:2024/06/05 22:40


//求二叉树中两个结点的最低公共祖先结点//获取结点的路径bool get_node_path(node* root,node* treenode,deque<node*> &path){if(root == NULL){return false;}//如果找到了将结点保存起来if(root == treenode){path.push_back(root);return true;}//如果没有找到则寻找path.push_back(root);//看看左子树是否有该节点bool found = get_node_path(root->left,treenode,path);//如果左子树没有找到该节点,则在右子树中寻找if(!found)found = get_node_path(root->right,treenode,path);//如果左右子树都没找到,则将之前保留的数据从容器中删除if(!found)path.pop_back();//返回寻找的结果0return found;}//获得公共节点node* get_common_node(node* root,deque<node*> &pathA,deque<node*> &pathB){if(root == NULL){return NULL;}else if(!root->left && !root->right){return root;}deque<node*>::iterator iterA = pathA.begin();deque<node*>::iterator iterB = pathB.begin();node* common_node = NULL;while(iterA!=pathA.end() && iterB!=pathB.end()){if(*iterA == *iterB){common_node = *iterA;}iterA++;iterB++;}return common_node;}//整合函数node* getLastParent(node* root,node* A,node* B){deque<node*> resultA;deque<node*> resultB;node* common;if(get_node_path(root,A,resultA) &&get_node_path(root,B,resultB)){common = get_common_node(root,resultA,resultB);}return common;}
测试:

int main(){node *root = new node(9);root->left = new node(4);root->left->left = new node(1);root->left->right = new node(5);root->right = new node(15);root->right->left = new node(10);root->right->right = new node(17);root->right->right->left = new node(16);node *q = getLastParent(root,root->left,root->left);if(!q)cout<<q->key<<endl;system("pause");return 0;}



0 0
原创粉丝点击