二叉树问题
二叉树问题总可以用几种方法解决:
- 递归的方法,基本上第一眼就是要用递归
2.几种遍历,前序、中序、后序、
层次遍历(重,还可以用来求最大宽度,)
void levelTraverse(BTNode*root)//还可以求最大宽度,
{
vector<BTNode*>v;
int front=0,rear;
if(root)
v.push_back(root);
int maxWidth=0;
while(front<v.size())
{
rear=v.size();
int tempMax=0;
while(front<rear)
{
tempMax++;
BTNode*temp=v[front++];
cout<<temp->a<<" ";
if(temp->lchild)v.push_back(temp->lchild);
if(temp->rchild)v.push_back(temp->rchild);
}
if(maxWidth<tempMax)
maxWidth=tempMax;
cout<<endl;
}
cout<<"这棵树的最大宽度是:"<<maxWidth<<endl;
}
3.非递归的后序遍历(用来找路径):任意节点的路径,一般和给定一个节点有关,
(1)路径和==key,输出路径
typedef struct{
BTNode* data;
int tag;//==0表示从左子节点返回,==1表示从右子节点返回
int sum;//每个节点到根节点的路径和
}Stack;
Stack stack[100];
int top=-1;
///////////////////////////////////////////////////////////////////////
void postOder(BTNode* root,int key)
{
while(root!=NULL||top>=0)
{
while(root!=NULL)
{
stack[++top].data=root;
stack[top].tag=0;
stack[top].sum=stack[top-1].sum+root->a;//路径的和
//cout<<stack[top].sum<<"++"<<endl;
root=root->lchild;
}
while(top>=0&&stack[top].tag==1)
{
/* if(stack[top].data->a==key)//当key等于给定的数时,找根到这个书的路径
{
while(top>=0)
{
cout<<stack[top--].data->a<<"--";
}
return;
}*/
// cout<<stack[top].sum<<"--"<<endl;
if(stack[top].sum==key&&(stack[top].data->lchild==NULL&&stack[top].data->rchild==NULL))//首先要是叶子节点,然后和==key
{
int temp=top;
while(temp>=0)
{
cout<<stack[temp--].data->a<<"--";//top后面还会用到,所以就用temp
}
cout<<endl;//不return ,说不定后面还有
}
//****************必须要有
/* int t=stack[top].data->a;
stack[top--].sum=stack[top].sum-t;*/
top--;
// cout<<stack[top--].data->a<<" ";
}
if(top>=0&&stack[top].tag==0)
{
stack[top].tag=1;
root=stack[top].data->rchild;
}
}
}
/*
void preOder(BTNode* root)
{
while(root!=NULL||top>=0)
{
cout<<root->a<<" ";
stack[++top].data=root;
root=root->lchild;
}
while()
}*/
(2)求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是 这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。
解答:用第三种方法,找到最大公共节点,知道了两条路径,长度分别是m,n, 而最大公共节点到根节点的长度是t,那么距离=m-t+n-t;

浙公网安备 33010602011771号