C++如何求二叉树中一个结点到根节点的路径?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++如何求二叉树中一个结点到根节点的路径?相关的知识,希望对你有一定的参考价值。
template <class T>
bool BiTree<T>::GetPath(char x, BiNode<T> *R)
if(R==NULL) return false;
if((R->data==x) || (GetPath(char x,R->lch)==true) ||(GetPath(char x,R->rch)==true))
cout<<R->data;
return true;
else
return false;
算法报错:
1>s:\c++ practice\实验三 二叉树\实验三 二叉树\二叉树.cpp(171) : error C2144: 语法错误 : “char”的前面应有“)”
1> s:\c++ practice\实验三 二叉树\实验三 二叉树\二叉树.cpp(169): 编译类 模板 成员函数“bool BiTree<T>::GetPath(char,BiNode<T> *)”时
1> with
1> [
1> T=char
1> ]
1> s:\c++ practice\实验三 二叉树\实验三 二叉树\二叉树.cpp(185): 参见对正在编译的类 模板 实例化“BiTree<T>”的引用
1> with
1> [
1> T=char
1> ]
1>s:\c++ practice\实验三 二叉树\实验三 二叉树\二叉树.cpp(171) : error C2660: “BiTree<T>::GetPath”: 函数不接受 0 个参数
1> with
1> [
1> T=char
1> ]
1>s:\c++ practice\实验三 二叉树\实验三 二叉树\二叉树.cpp(171) : error C2059: 语法错误 : “)”
1>s:\c++ practice\实验三 二叉树\实验三 二叉树\二叉树.cpp(172) : error C2143: 语法错误 : 缺少“;”(在“”的前面)
1>s:\c++ practice\实验三 二叉树\实验三 二叉树\二叉树.cpp(176) : error C2181: 没有匹配 if 的非法 else
有语法错误,由于GetPath(char x,R->lch)的第一个参数处的char关键字造成,修改为:
if((R->data==x) || (GetPath(x,R->lch)==true) ||(GetPath(x,R->rch)==true))
数据结构与算法面试题80道(11)
11.求二叉树中节点的最大距离...
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,
我们姑且定义"距离"为两节点之间边的个数。
写一个程序,
求一棵二叉树中相距最远的两个节点之间的距离。
错误思想:分别找左右子树到根的最深结点,相加。
错误原因:左子树上的左右子树到根的最深结点相加大于根节点左右子树到根的最深结点相加
正确思想:用动态规划来记录结点左右孩子的最大距离。
正确原因:从错误原因可以知道,最大距离为某一结点到它左右孩子的最大距离和
解题方法:(1)某一结点,左孩子为空,它到左孩子的距离为0;右孩子为空,它到右孩子的距离为0;
(2)若左孩子不为空,该结点左子树的最大距离为:左右子树的最大距离+1;若右孩子不为空,该结点右子树的最大距离为:左右子树的最大距离+1;
(3)维护最大距离。设置一个全局变量,记录结点左右孩子最大距离和的最大值。
(4)结果。结果等于最大距离*2。
#include<cstdio> #include<iostream> using namespace std; struct BSTreeNode{ int mMaxLeft;//左孩子的最长距离 int mMaxRight;//右孩子的最长距离 int m_nValue;//value of node BSTreeNode *m_pLeft;//left child node BSTreeNode *m_pRight;//right child node }; //建立二叉排序树 void addBSTreeNode(BSTreeNode *&pCurrent,int value){ //如果当前结点为空,直接插入,如果比当前结点大,插入当前结 //点的右结点,如果下,插入左结点。如果相等,默认忽略那个值 //第一个参数的&非常重要。否则需要手动遍历树来找到结点的位置 if(pCurrent==NULL){ BSTreeNode *pBSTree=new BSTreeNode(); pBSTree->mMaxLeft=0; pBSTree->mMaxRight=0; pBSTree->m_nValue=value; pBSTree->m_pLeft=NULL; pBSTree->m_pRight=NULL; pCurrent=pBSTree; }else if(pCurrent->m_nValue>value){ addBSTreeNode(pCurrent->m_pLeft,value); }else if(pCurrent->m_nValue<value){ addBSTreeNode(pCurrent->m_pRight,value); }else{ cout<<"node repeated,default ignore"<<endl; } } int mMaxLen=0;//最大值 //穿过根节点,最大距离为ans void max_distant(BSTreeNode *root){ if(root==NULL) return;//遍历到叶子结点,返回 if(root->m_pRight==NULL) root->mMaxRight=0; if(root->m_pLeft==NULL) root->mMaxLeft=0; if(root->m_pRight!=NULL)//如果右子树为空,最大长度为0,不为空,递归 max_distant(root->m_pRight); if(root->m_pLeft!=NULL)//如果左子树为空,最大长度为0,不为空,递归 max_distant(root->m_pLeft); if(root->m_pLeft!=NULL){//计算左子树最长节点距离 int mTempMax=0;//临时最大值 if(root->m_pLeft->mMaxLeft>root->m_pLeft->mMaxRight) mTempMax=root->m_pLeft->mMaxLeft; else mTempMax=root->m_pLeft->mMaxRight; root->mMaxLeft=mTempMax+1;//更新最大值 } if(root->m_pRight!=NULL){//计算右子树最长节点距离 int mTempMax=0;//临时最大值 if(root->m_pRight->mMaxLeft>root->m_pRight->mMaxRight) mTempMax=root->m_pRight->mMaxLeft; else mTempMax=root->m_pRight->mMaxRight; root->mMaxRight=mTempMax+1;//更新最大值 } if(root->mMaxLeft+root->mMaxRight>mMaxLen) mMaxLen=root->mMaxLeft+root->mMaxRight; } int main(){ BSTreeNode *root=NULL; addBSTreeNode(root,10); addBSTreeNode(root,6); addBSTreeNode(root,13); addBSTreeNode(root,5); addBSTreeNode(root,11); addBSTreeNode(root,3); max_distant(root); cout<<(mMaxLen<<1)<<endl; }
以上是关于C++如何求二叉树中一个结点到根节点的路径?的主要内容,如果未能解决你的问题,请参考以下文章
编写c++算法求任意二叉树中一条最长的路径,并输出此路径上各结点的值