二叉树问题

二叉树问题总可以用几种方法解决:

  1. 递归的方法,基本上第一眼就是要用递归

  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;

 

posted @ 2012-12-04 21:27  曙光_用代码记录人生  阅读(172)  评论(0编辑  收藏  举报