首页 > 编程知识 正文

输入x的值计算y并输出结果,求节点x在二叉树中的双亲节点算法

时间:2023-05-06 18:50:20 阅读:117358 作者:1710

假设二叉树采用两股结构。 设计递归算法,输出从根结点到值为x的节点的路径。 假设二叉树中所有节点的值都不同

解法一:采用求x节点所有祖先的方法。 这是因为x节点及其所有祖先正好构成了从根结点到x节点的路径(相反)。 用vector向量path收纳x节点及其祖先),也就是从根结点到x节点的反向路径,反向输出构成正向路径)。

f(b,x,path ) )大问题)求解过程:为空时,返回false; 如果b指向的节点是x节点,则将x节点的值添加到path后返回true;如果b指向的节点的孩子是x节点或其祖先,则将b指向的节点添加到path后返回true。

如果将b所指向的节点的左侧子节点设为x节点或其祖先设为f(b-lchild、x、path ),将b所指向的节点的右侧子节点设为x节点或其祖先设为f(b-rchild、x、path ),则均为

f(b,x,path )=false; b=NULL时

f(b,x,path )=true以成为b-data=x的方式将x追加到path中

f(b,x,path )=将真B- data添加到路径中如果f ) f(b-lchild,x,path )或f(b-rchild,x,path )为真

boolfindXPath1(Btnode*b,int x,vectorint path ) /求出从根结点到x节点的反向路径if ) b==null ) /空树为false { return false; (if ) B-data==x ) /值为x的节点(path.push_back ) x ); 返回真; 将//节点值添加到path中,然后单击true } else if (find XPath (Bt-lchild,x,path ) ) path.path ) 采用将//节点值添加到path并返回true }}解法二:的更直接的递归搜索方法。 用向量收纳从根结点到x节点的正向路径。

f(b、x、path )的求解过程; 如果b是空树,则返回false; 否则,将b节点值添加到path中,如果b-data=x,则搜索成功并返回true,如果b-data!=x在左侧子树中搜索,如果在左侧子树中找到值为x的节点,则返回true;如果在左侧子树中找不到x的节点,则返回在右侧子树中找到的结果。 在左右子树上找是个小问题。 对应的递归模型如下。

f(b,x,path )=false; b=NULL时

f(b,x,path )=将=trueb-data添加到path如果b-data=x

f(b,x,path )=truef(Bt-lchild,x,path )=true时

f(b,x,path )=f ) b-rchild,x,path )其他情况

要在设计算法时存储path求解的结果,必须设计参考参数。 引用参数类似于全局变量不能用作递归函数的状态,即贵妇人递归调用前的值。 因此,我们将设计一个临时参数tmppath,用于保存当前搜索路径,并在找到值为x的节点时将该路径复制到path中。 对应的算法如下

boolfindXPath(Btnode*Bt,int x,vectorint tmppath,vectorint path ) /从根节点到x节点的正向路径pathif ) Bt==null求空树//向当前节点返回pathif(Bt-data==x )//如果当前节点的值为x,则返回true ) path=tmppath; 返回真; }boolfind=findXpath(Bt-lchild,x,tmppath,path ); //用左子树if(find )//用左子树{ return true; (}在} else//左边的子树中找不到,在右边的子树中)查找returnfindxpath (Bt-rchild,x,tmppath,path ); }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。