数据结构之二叉树基础三

#include <iostream>
#include <vector>
#include <cstring>
#include <string>
#include <stack>
#include <vector>
#include <queue>
#include <cmath>

using namespace std;

struct BTNode
{
    int val;
    BTNode *lc;
    BTNode *rc;
};
typedef struct BTNode;



//重建二叉树
/*
1、用前序序列的第一个结点作为根结点;
2、在中序序列中查找根结点的位置,并以此为界将中序序列划分为左、右两个序列(左、右子树);
3、根据左、右子树的中序序列中的结点个数,将前序序列去掉根结点后的序列划分为左、右两个序列,它们分别是左、右子树的前序序列;
4、对左、右子树的前序序列和中序序列递归地实施同样方法,直到所得左、右子树为空。
*/
BTNode* Construct(int a[],int n,int b[],int m)
{
    //由前序遍历和中序遍历重建二叉树
}

//判断一棵二叉树是否为完全二叉树
bool isCompleteBT(BTNode*root)
{
    queue<BTNode*> q;
    BTNode* p;
    q.push(root);
    // 进行广度优先遍历(层次遍历),并把NULL节点也放入队列
    while((p=q.front())!=NULL)
    {
        q.pop();
        q.push(p->lc);
        q.push(p->rc);
    }
    //判断是否有未被访问到的结点
    while(!q.empty())
    {
        p=q.front();
        q.pop();
        if(p!=NULL)//未被访问的非空结点
        {
            return false;
        }
    }
    return true;
}




int depth(BTNode* root)
{
    if(root==NULL)
    {
        return 0;
    }
    int n1,n2;
    n1=depth(root->lc);
    n2=depth(root->lc);
    return (n1>n2)?1+n1:1+n2;
}



//找出二叉树中最远结点的距离
int maxPath=0;
int longestPath(BTNode*root)
{
    int temp;
    if(root!=NULL)
    {
        temp=depth(root->lc)+depth(root->rc);
        if(temp>maxPath)maxPath=temp;
    }
    if(root->lc!=NULL)
        longestPath(root->lc);//递归查找左子树
    if(root->rc!=NULL)
        longestPath(root->rc);//递归查找右子树
    return maxPath;
}


//二叉树中和为某一值的路径
void findPath(BTNode*pTreeNode,int expectedSum,vector<int> path,int currentSum)
{
    if(!pTreeNode)
        return;
    currentSum += pTreeNode->val;//结点值添加至当前和变量中
    path.push_back(pTreeNode->val);//结点压入栈中
    bool isLeaf = !(pTreeNode->lc) && !(pTreeNode->rc);//当前结点为叶子结点
    if(isLeaf&¤tSum == expectedSum)//叶子结点,和为期望值,打印路径
    {
        vector<int>::iterator iter;
        for(iter = path.begin(); iter != path.end(); iter++)
        {
            cout << *iter << " ";
        }
        cout << endl;
    }
    if(pTreeNode->lc)//当前结点不为叶子结点,查找它的左右孩子结点
        findPath(pTreeNode->lc, expectedSum, path, currentSum);
    if(pTreeNode->rc)
        findPath(pTreeNode->rc, expectedSum, path, currentSum);
    currentSum -= pTreeNode->val;//左右孩子结束,删除当前结点,退至其父结点
    path.pop_back();
}


//找到二叉树中两个结点最近的公共祖先结点
BTNode* FindNearestAncestor(BTNode*root)
{

}



//层序遍历
vector<vector<int> > levelOrder(BTNode* pRoot)
{
    vector<vector<int> > res;
    if(pRoot == NULL)
        return res;
    queue<BTNode*> Que;
    Que.push(pRoot);
    while(!Que.empty())
    {
        vector<int> vec;
        int size = Que.size();
        for(int i = 0; i < size; i ++)
        {
            BTNode* temp = Que.front();
            vec.push_back(temp->val);
            if(temp->lc)
                Que.push(temp->lc);
            if(temp->rc)
                Que.push(temp->rc);
            Que.pop();
        }
        res.push_back(vec);
    }
    return res;
}



int main()
{
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值