#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;
}
数据结构之二叉树基础三
最新推荐文章于 2021-07-28 21:00:55 发布