1.链式二叉树的遍历
1.创建
我们在之前说到二叉树的结构还可以为链表的形式,我们虽然没有完成链式二叉树的实现,到那时我们可以直接简单的构造一个出来。
例如;
typedef struct BinTreeNode {//binding沾粘关系
struct BinTreeNode* left;
struct BinTreeNode* right;
int val;
}BTNode;
BTNode* BuyBTNode(int val) {
BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
if (newnode == NULL) {
perror("malloc fail");
return ;
}
newnode->val = val;
newnode->left = newnode->right = NULL;
return newnode;
}
BTNode* createTree() {
BTNode*n1= BuyBTNode(1);
BTNode*n2= BuyBTNode(2);
BTNode*n3= BuyBTNode(3);
BTNode*n4= BuyBTNode(4);
BTNode*n5= BuyBTNode(5);
BTNode*n6= BuyBTNode(6);
n1->left = n2;
n1->right = n4;
n2->left = n3;
n4->left = n5;
n4->right = n6;
return n1;
}
2.前序遍历
所谓的前序遍历其实就是根 左子树 右子树的规律来遍历的。
例如上面我们创建的链式二叉树,如果用前序遍历来的话,就会得到1 2 3 4 5 6
其实在学这方面的时候哦我们可以加上NULL来方便学习。就会得到1 2 3 N N N 4 5 N N 6 N N
究竟是怎么来的呢?我们来看下:
我们在创建节点时给每个节点两个指针,初始化的时候都是NULL,所以在叶子的底部还有NULL,且2的右子树也是NULL。我们可以利用这来写一个递归函数。
void preOrder(BTNode*root) {//root 根 prv在..前 order 顺序
if (root == NULL) {
printf("NULL ");
return;
}
printf("%d ", root->val);
preOrder(root->left);
preOrder(root->right);
}
我们来看下结果是否正确:
3.中序遍历、后序遍历
中序遍历:左子树 根 右子树
后序遍历:左子树 右子树 根
void InOrder(BTNode* root) {//root 根 prv在..前 order 顺序
if (root == NULL) {
printf("NULL ");
return;
}
InOrder(root->left);
printf("%d ", root->val);
InOrder(root->right);
}
void atfOrder(BTNode* root) {//root 根 prv在..前 order 顺序
if (root == NULL) {
printf("NULL ");
return;
}
atfOrder(root->left);
atfOrder(root->right);
printf("%d ", root->val);
}
4.链式二叉树的字节个数
int TreeSize1(BTNode* root , int *size) {
if (root == NULL) {
return;
}
else
++(*size);
TreeSize(root->left,size);
TreeSize(root->right ,size);
return *size;
}
那么这里我们为啥要传入一个整型的地址呢?因为我们在不断开辟栈帧的过程中每一个size都是不同的,如果不用指针进行解引用++那么就会发生size只会得到第一次栈帧的++,所以我们在次使用传地址的方式。
还有一种更好的方式,那就是采用后序遍历的思想来写。
int TreeSize(BTNode*root) {
return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}//经典后序计算方式
5.链式二叉树的高(深度)
注意:一般树的高度都是从1开始计算的,除非题目有要求说明。
//树的高度
int TreeHeight(BTNode* root) {
if (root == NULL) {
return 0;
}
int leftHeight = TreeHeight(root->left);
int rightHeight = TreeHeight(root->right);
return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}
这些都是递归代码,大家可以话递归展开图,方便理解。
