您的位置:首页 > 职场人生

寻找二叉树两个结点的最低共同父节点(2014京东笔试题)

2015-03-06 17:49 393 查看
这道题小编提供两种方式进行解答:1.使用递归的思想;2.使用迭代的思想

1.使用递归的思想(从根节点自上向下查找,优点直观易懂,缺点使用较大内存)

思想:这种方法从根节点自上向下查找两个节点,直到找到为止

typedef struct BiTreeNode{
int data;
struct BiTreeNode *lchild,*rchild;
};

//寻找二叉树两个结点的最低共同父节点
BiTreeNode *FindCommonParentNode(BiTreeNode *pRoot,BiTreeNode *pNodeOne,BiTreeNode *pNodeTow){
if(NULL==pRoot){
return NULL;
}
//判断与pNodeOne或pNodeTow相等的节点位置
if(pRoot==pNodeOne||pRoot==pNodeTow){
return pRoot;
}
//在左右子树中寻找与pNodeOne或pNodeTow相等的节点
BiTreeNode *pLeft=FindCommonParentNode(pRoot->lchild,pNodeOne,pNodeTow);
BiTreeNode *pRight=FindCommonParentNode(pRoot->rchild,pNodeOne,pNodeTow);

if(NULL==pLeft){//在左子树没有找到相应的节点,那么目标必存在右子树中,并且最小的共同父节点是右子树的头结点
return pRight;
}else if(NULL==pRight){//在右子树中没有找到相应的节点,那么目标必存在左子树中,并且最小的共同父节点是左子树的头结点
return pLeft;
}else{//在左右子树都找到目标,说明pRoot就是要寻找的最小共同父节点
return pRoot;
}

}


2.使用迭代思想(从两目标节点自下向上查找,缺点运行较长时间,改进:可以牺牲内存记录找过的节点)

思路:这种方法从两个节点开始自下向上寻找共同父节点

typedef struct BinTreeNode{
int data;
struct BinTreeNode *lchild,*rchild,*parent;
};

//寻找二叉树两个结点的最低共同父节点
BinTreeNode *FindCommonParentNode2(BinTreeNode *pNodeOne,BinTreeNode *pNodeTow){
assert(NULL!=pNodeOne&&NULL!=pNodeTow);
BinTreeNode *pRootOne=pNodeOne,*pRootTow;
while(pRootOne){
pRootTow=pNodeTow;
while(pRootTow){
if(pRootTow==pRootOne){
return pRootOne;
}
pRootTow=pRootTow->parent;
}
pRootOne=pRootOne->parent;
}
return pRootOne;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息