
3.1.1
度为0结点数 = 度为2的结点+1
二叉树的第 i 层上至多有 2^(i-1) 个结点 (i≥1)
深度为 k 的二叉树至多有 2^k - 1 个结点 (k≥1)
3.1.2
#include"stdio.h"
#include <iostream>
using namespace std;
#define MAXSIZE 100
typedef struct arrayTree
{
//array从下标一开始,下标0标记为长度
int array[MAXSIZE+1];
}ArrayTree;
ArrayTree a;
// 找到父节点
int findFather (int i)
{
if (i == 1) return -1;
return i/2;
}
// 找到左节点
int leftChild (int i)
{
if(i*2<=MAXSIZE)
return i*2;
return -1;
}
// 找到右节点
int rightChild (int i)
{
if(i*2+1<=MAXSIZE)
{
return i*2+1;
}
return -1;
}
// 3.1.6 先序遍历
void preOrder(int i) {
if (i > MAXSIZE || a.array[i] == 0) return;
cout << a.array[i] << " "; // 访问根节点
int left = leftChild(i);
if (left != -1) preOrder(left); // 遍历左子树
int right = rightChild(i);
if (right != -1) preOrder(right); // 遍历右子树
}
// 3.1.6 中序遍历
void inOrder(int i) {
if (i > MAXSIZE || a.array[i] == 0) return;
int left = leftChild(i);
if (left != -1) inOrder(left); // 遍历左子树
cout << a.array[i] << " "; // 访问根节点
int right = rightChild(i);
if (right != -1) inOrder(right); // 遍历右子树
}
// 3.1.6 后序遍历
void postOrder(int i) {
if (i > MAXSIZE || a.array[i] == 0) return;
int left = leftChild(i);
if (left != -1) postOrder(left); // 遍历左子树
int right = rightChild(i);
if (right != -1) postOrder(right); // 遍历右子树
cout << a.array[i] << " "; // 访问根节点
}
int main()
{
a.array[0] = 7; // 共7个节点
a.array[1] = 1;
a.array[2] = 2;
a.array[3] = 3;
a.array[4] = 4;
a.array[5] = 5;
a.array[6] = 6;
a.array[7] = 7;
// 测试父节点查找
printf("节点5的父节点编号: %d\n", findFather(5));
printf("节点3的父节点编号: %d\n", findFather(3));
// 测试遍历
printf("先序遍历: ");
preOrder(1);
printf("\n");
printf("中序遍历: ");
inOrder(1);
printf("\n");
printf("后序遍历: ");
postOrder(1);
printf("\n");
}
1794

被折叠的 条评论
为什么被折叠?



