寻找二叉树两个结点的最低共同父节点(2014京东笔试题)
2015-03-06 17:49
393 查看
这道题小编提供两种方式进行解答:1.使用递归的思想;2.使用迭代的思想
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; }
相关文章推荐
- 算法-寻找二叉树两个结点的最低共同父节点(OC实现)
- 寻找二叉树两个结点的最低共同父节点
- 寻找二叉树两个结点的最低共同父节点
- 二叉树两个结点的最低共同父节点
- 一颗普通的二叉树,如何寻找两个节点的最低公共祖先(发现的一个与算法无关的引用问题)
- 寻找二叉树两个节点的最低公共祖先
- C语言 二叉树中寻找指定两个数值的最低父节点
- 寻找二叉树中两个节点的最近的公共祖先——迅雷笔试归来
- 寻找二叉树两个节点的最低公共祖先
- 找出二叉树中两个节点的最低共同父节点
- 判断二叉树中两个节点的最低共同父节点
- 判断二叉树中两个节点的最低共同父节点
- 寻找二叉树两个节点的最低公共祖先
- 寻找二叉树两个节点的最低公共祖先(LCA)
- 在线笔试-求二叉树中俩个节点的最低共同父节点
- 【二叉树】寻找二叉树/BST的两个节点的最低公共祖先
- 程序员面试100题之五 二叉树两个节点的最低共同父节点
- 算法: 在二叉树中找到两个节点的最低共同父节点
- 寻找二叉树两个节点的最低公共祖先
- 寻找二叉树两个节点的最低公共祖先