二叉树基础知识


一、什么是二叉树?

  树有很多种,二叉树,三叉树之类的,二叉树就是只有左右两个分支(孩子)的树。而二叉树又分为满二叉树和完全二叉树。

1 满二叉树

  除最后一层外,每一棵树都有左右两个非空孩子。如下:

## 2 完全二叉树   完全二叉树要求除最后一层外,前面h-1层必须铺满,因此满二叉树也是完全二叉树

3 二叉树的相关性质

   ( 1 )在二叉树的第 i 层至多有 2 i − 1 个结点,深度为 k 的二叉树至多有 2 k − 1 个结点 (1)在二叉树的第 i 层至多有 2 ^{i − 1}个结点,深度为k的二叉树至多有2^k-1个结点 1)在二叉树的第i层至多有2i1个结点,深度为k的二叉树至多有2k1个结点
( 2 )对任何一棵二叉树,如果其叶子结点数为 n 0 , 度为二的结点数为 n 2 , 则 n 0 = n 2 + 1 , 又总结点数 n = n 0 + n 1 + n 2 , 因此 n = n 1 + 2 n 2 + 1 (2) 对任何一棵二叉树,如果其叶子结点数为n_0,度为二的结点数为n_2,则n_0=n_2+1,又总结点数n=n_0+n_1+n_2,因此n=n_1+2n_2+1 2)对任何一棵二叉树,如果其叶子结点数为n0,度为二的结点数为n2,n0=n2+1,又总结点数n=n0+n1+n2,因此n=n1+2n2+1
( 3 )若二叉树结点数为 n ,则其高度为 [ l o g n ] + 1 , 设高度为 k 层,则 2 k − 1 − 1 + 1 < n < 2 k − 1 , 所以 k < = [ l o g n ] + 1 (3)若二叉树结点数为n,则其高度为[logn]+1,设高度为k层,则2^{k-1}-1+1<n<2^k-1,所以k<=[logn]+1 3)若二叉树结点数为n,则其高度为[logn]+1,设高度为k层,则2k11+1<n<2k1,所以k<=[logn]+1



二、创建和遍历二叉树

  这里我们手动构建一个二叉树,二叉树需要左右孩子两个指针,数的本质是递归的,定义这样一个结构体,便能访问到所有结点。

1 DFS遍历

  二叉树的遍历有前、中、后序三种,前序:根->左->右,中序:左->根->右 ,后序:左->右->根

typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;
BTNode* BuyNode(BTDataType x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	assert(newnode);
	newnode->data = x;
	newnode->left = NULL;
	newnode->right = NULL;
	return newnode;
}

BTNode* CreatTree()
{
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);
	BTNode* node7 = BuyNode(7);
	BTNode* node8 = BuyNode(8);
	node1->left = node2;
	node1->right = node3;
	node2->left = node4;
	node2->right = node5;
	node3->left = node6;
	node3->right = node7;
	node4->left = node8;
	return node1;
}

void PreOrder(BTNode* root)
{
	if (root == NULL)
		return;
	printf("%d ", root->data);
	PreOrder(root->left);
	PreOrder(root->right);
}

void InOrder(BTNode* root)
{
	if (root == NULL)
		return;
	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}

void PostOrder(BTNode* root)
{
	if (root == NULL)
		return;
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->data);
}



2 BFS 层序遍历

  层序遍历要求我们输入一个字符串,为了控制结束标志,这里我们用字符’#'表示结点值为NULL。

#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
    char val;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;
TreeNode* CreatTree(char* a, int* pi) {
    if (a[*pi] != '#') {
        TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
        root->val = a[*pi];
        (*pi)++;
        root->left = CreatTree(a, pi);
        root->right = CreatTree(a, pi);
        return root;
    } 
    else {
        (*pi)++;
        return NULL;
    }

}
void inOrder(TreeNode* root) {
    if (root == NULL)
        return;
    inOrder(root->left);
    printf("%c ", root->val);
    inOrder(root->right);
}
int main() {
    char a[100];
    scanf("%s", a);
    int i = 0;
    TreeNode* root = CreatTree(a, &i);
    inOrder(root);
    return 0;
}



三 总结

  这些都是二叉树的基础知识,下一篇会运用到一些二叉树的相关性质并且附上相关OJ。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰瑞的猫^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值