二叉树的基本操作及面试题

typedef int DataType;
typedef struct BinaryTreeNode
{
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
BTDataType _data;
}BTNode;
BTNode* BuyBTNode(BTDataType x)//创建新结点
{
BTNode* node=(BTNode*) malloc(sizeof(BTNode));
assert(node);
node->_left=NULL;
node->_right=NULL;
node->_data=x;
return node;
}

BTNode* CreateBTree(BTDataType*a,size_t*pIndex,BTDataType invalid)//创建树
{
BTNode* root=NULL;//创建树的根
if(a[*pIndex]!=invalid) //遍历数组内容,遇到的不是非法值时,创建结点
{
root=BuyBTNode(a[*pIndex]) ;
++(*pIndex);
root->_left=CreateBTree(a,pIndex,invalid);
++(*pIndex);
root->_right=CreateBTree(a,pIndex,invalid);
}
return root;
}
//创建树后,接下来就是树的基本操作了
void BTreePreOrder(BTNode* root) //前序遍历
{
if(root==NULL)
{
return;
}
printf(“%d”,root->_data);
BTreePrevOrder(root->_left);
BTreePreOrder(root->_right);
}
void BTreeInOrder(BTNode* root)//中序遍历
{
if(root==NULL)
{
return;
}
BTreeInOrder(root->_left);
printf(“%d”),root->_data);
BTreeInOrder(root->_right);
}
void BTreePostOrder(BTNode* root)//后序遍历
{
if(root==NULL)
{
return;
}
BTreePostOrder(root->_left);
BTreePostOrder(root->_right);
printf(“%d”),root->_data);
}
//一般面试题,二叉树的属性
size_t BTreeSize(BTNode* root) //求树的结点数
{
//递归遍历一遍二叉树,每递归一次就加一
if(root==NULL)
{
return 0;
}
return BTreeSize(root->_left)+BTreeSize(root->_right)+1;
}

size_t BTreeLeafSize(BTNode*root)//求树的叶子数
{
//在上面的基础上,添加限制条件,当该结点的左子树和右子树同时为空,即为叶子的时候加1
if(root==NULL)
{
return 0;
}
if(root->_left==NULL||root->_right==NULL)
{
return 1;
}
return BTreeLeafSize(root->_left)+BTreeLeafSize(root->_right);
}

//求树的第k层结点数
size_t BTreeKLevelSize(BTNode*root,sizr_t k)
{
思路:从根往下走,走K层,k在这个过程中不停自减,当k等于1时代表走到第k层了

if(root==NULL)
{
    return 0;
}
if(k==1) 
{
    return 1;
}
return BTreeKLevelSize(root->_left,k-1)+BTreeKLevelSize(root->_right,k-1);

}
//求树的深度
size_t BTreeDepth(BTNode* root)
{
if(root==NULL)
{
return 0;
}
size_t leftDepth=BTreeDepth(root->_left);
size_t rightDepth=BTreeDepth(root->_right);
return leftDepth>rightDepth? leftDepth+1: rightDepth+1;
}
//求树中的结点
BTNode* BTreeFind(BTNode* root.BTDataType x)
{
//思路:遍历二叉树查找
if(root==NULL)
{
return NULL;
}
if(root->_data==x)
{
return root;
}
//定义两个变量接受查找的结果再用if判断的好处是,如果找到了,就不再往下递归了,节省时间
BTNode* rightRet=BTreeFind(root->_right,x) ;
if(rightRet)
{
return rightRet;
}
return NULL;
}
//二叉树进阶面试题
//判断是否为完全二叉树
//先介绍一个函数:层序遍历,即一层一层的访问二叉树,用到了队列
void BTreeLevelOrder(BTNode*root) //层序遍历
{
Queue q;
QueueInit(&q) ;
if(root)
{
QueuePush(&q,root);
}
while(QueueEmpty(&q)!=0)
{
BTNode* front=QueueFront(&q);
printf(“%d”,front->_data);
QueuePop(&q);
if(front->_left!=NULL)
{
QueuePush(&q,front->_left);
}
if(front->_rignt!=NULL)
{
QueuePush(&q,front->_right);
}
}
printf(“\n”);
}
了解层序遍历之后就可以用它来检验是否是完全二叉树
在这之前,我们先弄清楚什么是完全二叉树
完全二叉树:二叉树的前n层都是满的,且第n层从左往右必须是连续的
int IsCompleteBTree(BTNode* root)
{
Queue q;
QueueInit(&q);
if(root)//先把根结点入队,以保证第一次检验对列不为空
{
QueuePush(&q,root);
}
while(QueueEmpty(&q)!=0)
{
BTNode* front=QueueFront(&q);
QueuePop(&q);
if(front==NULL)
{
break;
}
else
{
QueuePush(&q,front->_left);
QueuePush(&q,front->_right);
}
}
while(QueueEmpty(&q)!=0)
{
BTNode* front=QueueFront(&q);
if(front!=NULL)
{
return 0;
}
QueuePop(&q);
}
return 1;
}
//判断是否是完全二叉树这个函数中使用了层序遍历的方法,但是有些改动就是把NULL也入队列了
//出队时,检测到队头为NULL后停止遍历,在判断队是否为空,如果队为空,则是完全二叉树,
//反之,开始检验队内数据是否为空,是则是完全二叉树
// 因为完全二叉树的第n层从左往右是连续的,则层序遍历后数据与数据之间不可能存在NULL。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值