知识大全 数据结构考研分类复习真题 第六章 答案 (五)[12]
Posted 结点
篇首语:缥帙各舒散,前后互相逾。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据结构考研分类复习真题 第六章 答案 (五)[12]相关的知识,希望对你有一定的参考价值。
[题目分析]后序遍历最后访问根结点 即在递归算法中 根是压在栈底的 采用后序非递归算法 栈中存放二叉树结点的指针 当访问到某结点时 栈中所有元素均为该结点的祖先 本题要找p和q 的最近共同祖先结点r 不失一般性 设p在q的左边 后序遍历必然先遍历到结点p 栈中元素均为p的祖先 将栈拷入另一辅助栈中 再继续遍历到结点q时 将栈中元素从栈顶开始逐个到辅助栈中去匹配 第一个匹配(即相等)的元素就是结点p 和q的最近公共祖先
typedef struct BiTree t;int tag;//tag= 表示结点的左子女已被访问 tag= 表示结点的右子女已被访问 stack; stack s[] s [];//栈 容量够大 BiTree Ancestor(BiTree ROOT p q r)//求二叉树上结点p和q的最近的共同祖先结点r top= ; bt=ROOT; while(bt!=null ||top> ) while(bt!=null && bt!=p && bt!=q) //结点入栈 s[++top] t=bt; s[top] tag= ; bt=bt >lchild; //沿左分枝向下 if(bt==p) //不失一般性 假定p在q的左侧 遇结点p时 栈中元素均为p的祖先结点 for(i= ;i<=top;i++) s [i]=s[i]; top =top; //将栈s的元素转入辅助栈s 保存 if(bt==q) //找到q 结点 for(i=top;i> ;i )// 将栈中元素的树结点到s 去匹配 pp=s[i] t; for (j=top ;j> ;j ) if(s [j] t==pp) printf( p 和q的最近共同的祖先已找到 ) return (pp); } while(top!= && s[top] tag== ) top ; //退栈 if (top!= ){s[top] tag= ;bt=s[top] t >rchild;} //沿右分枝向下遍历 //结束while(bt!=null ||top> ) return(null);//q p无公共祖先 }//结束Ancestor
cha138/Article/program/sjjg/201311/23728相关参考