二叉树链式存储
手动建树
先序遍历
中序遍历
后序遍历
得到第k层 节点的个数
二叉树链式存储
通过 根 节点 找到左右子树 依次 迭代遍历
typedef int BTDataType;
typedef struct BinaryTreeNode
{
BTDataType data; //数据域
struct BinaryTreeNode* left;//指针域 指向 左子树
struct BinaryTreeNode* right;//指针域 指向 右子树
}BTreeNode;
手动建树
在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习 ,手动建树 非常的好 想要什么类型的就可以构建什么类型的
首先malloc出一个节点
BTreeNode* BuyNode(BTDataType x)
{
BTreeNode* newnode =(BTreeNode*)malloc(sizeof(BTreeNode));
if (newnode == NULL)
{
perror("malloc:");
return NULL;
}
newnode->data = x;
newnode->left = NULL;//为了防止野指针 必须先 置空
newnode->right = NULL;//为了防止野指针 必须先 置空
return newnode;// 返回已经malloc的新节点
}
手挫建树 自己动手丰衣足食
调用 BuyNode() 函数 ,malloc出 7个节点 再把它们 连接起来, node1->left 指向 node2 node1->right 指向 node4 node2->left指向 node3 node2->right 指向NULL node4->left指向 node5 node4->right指向node6, node3->left指向NULL node3->right指向 node7 树就构建成了
BTreeNode* GreaBinaryTree()
{
BTreeNode* node1 = BuyNode(1);
BTreeNode* node2 = BuyNode(2);
BTreeNode* node3 = BuyNode(3);
BTreeNode* node4 = BuyNode(4);
BTreeNode* node5 = BuyNode(5);
BTreeNode* node6 = BuyNode(6);
BTreeNode* node7 = BuyNode(7);
node1->left = node2;
node1->right = node4;
node2->left = node3;
node4->left = node5;
node4->right = node6;
node3->right = node7;
return node1;
}
先序遍历 (思路:)
先序遍历 :根 左子树 右子树 通俗的讲 根在前面 就是前序遍历 重点:是根的位置
// 前序遍历 根 左子树 右子树 通俗的讲 根在前面 就是前序遍历 重点:是根的位置
void preorder_traversal(BTreeNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
printf("%d ", root->data);
preorder_traversal(root->left);
preorder_traversal(root->right);
}
先序遍历递归展开图
输出:
画的不好,兄弟们凑合看吧
中序遍历
//中序遍历 左子树 根 右子树 通俗的讲 根在中间 就是中序遍历 重点:是根的位置
代码逻辑
void or_traversal(BTreeNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
or_traversal(root->left);
printf("%d ", root->data);
or_traversal(root->right);
}
比较 先序遍历 和中序遍历 可以帮助我们更好理解
重点:遍历是根的位置
后序遍历
后序遍历: 左子树 右子树 根 通俗的讲 根在最后 就是后序遍历 重点:是根的位置
代码
void postorder_traversal(BTreeNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
postorder_traversal(root->left);
postorder_traversal(root->right);
printf("%d ", root->data);
}
套路都是一样的
得到第k层 节点的个数
思路: 第k 次 节点 == k的左子树 (k-1) + k的右子树(k-1)
在当前树中 假设 k =3 求出 第3 次节点的个数 对1来说 是第3次 对1的左右子树 2和4来说是底2层, 2的左右子树来说是第一层,对4 的左右子树 来说也是底一层
代码
//获取第k 层 节点的个数
int KeelBTree(BTreeNode* root, int k)
{
if (root == NULL)
return 0;
if (k == 1)
return 1;
int leftK = KeelBTree(root->left, k - 1);
int rightK = KeelBTree(root->right, k - 1);
return leftK + rightK;
}
递归展开图
总结·:
学习链式二叉树 如果有什么地方没有明白 一定要画递归展开图,代码反复敲 等一看到键盘思路就出来了那就大成了 ,五遍见效 也不要盲目敲
每次都想一想为啥这样写
以上就是本文所要描述的所有内容,感谢您对本文的观看