zoukankan      html  css  js  c++  java
  • 二叉树问题

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

    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;

  • 相关阅读:
    光棒效果的几种方法
    jQuery中的事件与动画
    jQuery中.bind() .live() .delegate() .on()的区别
    JavaScript基础
    jQuery选择器课堂随笔
    Leetcode_34【在排序数组中查找元素的第一个和最后一个位置】
    Leetcode_33【搜索旋转排序数组】
    Leetcode_32【最长有效括号】
    Leetcode_31【下一个排列】
    Leetcode_30【串联所有单词的子串】
  • 原文地址:https://www.cnblogs.com/shuguang/p/2802076.html
Copyright © 2011-2022 走看看