二叉树 的构建、层序遍历

1.根据前中序构建一颗二叉树

struct BNode
{
    BNode(int val)
    :pLeft(NULL)
    , pRight(NULL)
    ,data(val)
    {
    }
    BNode* pLeft;
    BNode* pRight;
    int data;
};

BNode* _RebulidBinaryTree(BNode* &pRoot,int* pre,int* In,int size)
{
    if (size <1)
    {
        return NULL;
    }
    pRoot = new BNode(*pre);
    int index = 0;
    while (index < size)
    {
        if (*pre == In[index])break;

        index++;
    }
    //index之前构建左子树,  index之后构建右子树
    //递归构建
    _RebulidBinaryTree(pRoot->pLeft, pre+1, In, index);
    _RebulidBinaryTree(pRoot->pRight, pre+index+1, In+index+1, size-index-1);  //因为元素个数减少了1个

    return pRoot;
}
void Test1()
{
    int pre[] = {1,2,4,5,3,6,7};
    int order[] = {4,2,5,1,6,3,7};
    //BNode* pRoot = CreateTree(pre,order,7);
    BNode*  pRoot = NULL;
    _RebulidBinaryTree(pRoot,pre,order,7);
}

2.层序遍历二叉树

void LevelTraversal(BNode* pRoot)
{
    if (pRoot == NULL)
    {
        return;
    }
    queue<BNode*> q;
    q.push(pRoot);

    while (!q.empty())
    {
        BNode* pCur = q.front();
        cout<<pCur->data << " ";
        q.pop();
        if (pCur->pLeft)
        {
            q.push(pCur->pLeft);
        }
        if (pCur->pRight)
        {
            q.push(pCur->pRight);
        }
    }

    cout << endl;
}

3.给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。


int  getZeroCount3(int n)
{
    int ret = 0;
    while (n)
    {
        ret += n / 5;
        n /= 5;
    }
    return ret;
}

4.求两个结点的最近公共祖先

答题思路:1、学会提问,好的面试是和面试官愉快的讨论,相互提问。请教。

1.这棵树是二叉树吗?
如果是二叉树,那这棵树是用用什么来表示的?是用双亲表示法、孩子双亲表示法,还是孩子表示法来进行表示的?

2.如果是的话,就可以看成是单链表的相交的问题了。

如果不是的话,那这棵树是二叉搜索树(有序)的话是可以找到公共祖先的。

思路是:
①如果左右两个结点的值均小于根结点的值,则根节点向左继续查找。
②如果左右两个结点的值均大于根结点的值,则根节点向有继续查找。
③如果左右节点的值一个大于根节点的值,一个小于根结点的值,那么根节点就是要求的最小公共祖先。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值