1.顺序存储
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
int tree[MAX_SIZE];
int size = 0;
void insert(int value) {
if (size >= MAX_SIZE) {
printf("二叉树已满,无法插入新元素\n");
return;
}
tree[size] = value;
size++;
}
void preOrder(int index) {
if (index >= size) return;
printf("%d ", tree[index]);
preOrder(2 * index + 1);
preOrder(2 * index + 2);
}
void inOrder(int index) {
if (index >= size) return;
inOrder(2 * index + 1);
printf("%d ", tree[index]);
inOrder(2 * index + 2);
}
void postOrder(int index) {
if (index >= size) return;
postOrder(2 * index + 1);
postOrder(2 * index + 2);
printf("%d ", tree[index]);
}
int main() {
insert(1);
insert(2);
insert(3);
insert(4);
insert(5);
printf("先序遍历结果: ");
preOrder(0);
printf("\n");
printf("中序遍历结果: ");
inOrder(0);
printf("\n");
printf("后序遍历结果: ");
postOrder(0);
printf("\n");
return 0;
}
2.链式存储
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
if (newNode) {
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
}
return newNode;
}
TreeNode* insert(TreeNode* root, int data) {
TreeNode* newNode = createNode(data);
if (root == NULL) {
return newNode;
} else {
TreeNode* queue[100];
int front = -1, rear = -1;
queue[++rear] = root;
while (1) {
TreeNode* current = queue[++front];
if (current->left == NULL) {
current->left = newNode;
break;
} else {
queue[++rear] = current->left;
}
if (current->right == NULL) {
current->right = newNode;
break;
} else {
queue[++rear] = current->right;
}
}
return root;
}
}
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->data);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
void inorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->data);
inorderTraversal(root->right);
}
void postorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->data);
}
void levelOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
TreeNode* queue[100];
int front = -1, rear = -1;
queue[++rear] = root;
while (front != rear) {
TreeNode* current = queue[++front];
printf("%d ", current->data);
if (current->left != NULL) {
queue[++rear] = current->left;
}
if (current->right != NULL) {
queue[++rear] = current->right;
}
}
}
int main() {
TreeNode* root = NULL;
int values[] = {1, 2, 3, 4, 5, 6, 7};
int numNodes = sizeof(values) / sizeof(values[0]);
for (int i = 0; i < numNodes; i++) {
root = insert(root, values[i]);
}
printf("前序遍历结果:");
preorderTraversal(root);
printf("\n");
printf("中序遍历结果:");
inorderTraversal(root);
printf("\n");
printf("后序遍历结果:");
postorderTraversal(root);
printf("\n");
printf("层次遍历结果:");
levelOrderTraversal(root);
printf("\n");
return 0;
}
中序、后序、先序非递归
#include <stdio.h>
#include <stdbool.h>
#define MaxSize 100
typedef struct Tree {
int data;
struct Tree* lchild;
struct Tree* rchild;
} Node, *Tree;
int main() {
Tree root = (Tree)malloc(sizeof(Node));
root->data = 1;
root->lchild = (Tree)malloc(sizeof(Node));
root->lchild->data = 2;
root->lchild->lchild = (Tree)malloc(sizeof(Node));
root->lchild->lchild->data = 4;
root->lchild->lchild->lchild = NULL;
root->lchild->lchild->rchild = NULL;
root->lchild->rchild = (Tree)malloc(sizeof(Node));
root->lchild->rchild->data = 5;
root->lchild->rchild->lchild = NULL;
root->lchild->rchild->rchild = NULL;
root->rchild = (Tree)malloc(sizeof(Node));
root->rchild->data = 3;
root->rchild->lchild = (Tree)malloc(sizeof(Node));
root->rchild->lchild->data = 6;
root->rchild->lchild->lchild = NULL;
root->rchild->lchild->rchild = NULL;
root->rchild->rchild = NULL;
printf("中序遍历: ");
InOrder(root);
printf("\n");
printf("前序遍历: ");
PreOrder(root);
printf("\n");
printf("后序遍历: ");
PostOrder(root);
printf("\n");
return 0;
}
void InOrder(Tree bt) {
Node* stack[MaxSize];
int top = -1;
Node* p = bt;
while (p != NULL || top != -1) {
while (p != NULL) {
stack[++top] = p;
p = p->lchild;
}
if (top != -1) {
p = stack[top--];
printf("%d ", p->data);
p = p->rchild;
}
}
}
void PostOrder(Tree bt) {
Node* stack1[MaxSize];
Node* stack2[MaxSize];
int top1 = -1;
int top2 = -1;
Node* p = bt;
stack1[++top1] = p;
while (top1 != -1) {
p = stack1[top1--];
stack2[++top2] = p;
if (p->lchild != NULL) {
stack1[++top1] = p->lchild;
}
if (p->rchild != NULL) {
stack1[++top1] = p->rchild;
}
}
while (top2 != -1) {
p = stack2[top2--];
printf("%d ", p->data);
}
}
void PreOrder(Tree bt) {
Node* stack[MaxSize];
int top = -1;
Node* p = bt;
while (p != NULL || top != -1) {
while (p != NULL) {
printf("%d ", p->data);
stack[++top] = p;
p = p->lchild;
}
if (top != -1) {
p = stack[top--];
p = p->rchild;
}
}
}
3.习题
5.非递归求书高(层次和后序)
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
if (newNode) {
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
}
return newNode;
}
int getHeight1(TreeNode* root) {
if (root == NULL) {
return 0;
}
int height = 0;
int maxHeight = 0;
TreeNode* current = NULL;
TreeNode* lastVisit = NULL;
TreeNode* stack[100];
int top = -1;
while (root != NULL || top != -1) {
while (root != NULL) {
stack[++top] = root;
root = root->left;
}
current = stack[top];
if (current->right == NULL || current->right == lastVisit) {
height = top + 1;
maxHeight = (height > maxHeight) ? height : maxHeight;
lastVisit = current;
top--;
} else {
root = current->right;
}
}
return maxHeight;
}
int getHeight2(TreeNode* root) {
if (root == NULL) {
return 0;
}
int height = 0;
TreeNode* current = NULL;
TreeNode* queue[100];
int front = -1, rear = -1;
queue[++rear] = root;
while (front != rear) {
int levelSize = rear - front;
while (levelSize > 0) {
current = queue[++front];
if (current->left != NULL) {
queue[++rear] = current->left;
}
if (current->right != NULL) {
queue[++rear] = current->right;
}
levelSize--;
}
height++;
}
return height;
}
int main() {
TreeNode* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
root->right->left = createNode(6);
root->right->right = createNode(7);
root->left->left->left = createNode(8);
int height1 = getHeight1(root);
printf("二叉树的高度为: %d\n", height1);
int height2 = getHeight2(root);
printf("二叉树的高度为: %d\n", height2);
return 0;
}
8.计算二叉树所有双分支节点
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
if (newNode) {
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
}
return newNode;
}
int countDoubleBranchNodes(TreeNode* root) {
if (root == NULL)
return 0;
int leftCount = countDoubleBranchNodes(root->left);
int rightCount = countDoubleBranchNodes(root->right);
if (root->left != NULL && root->right != NULL) {
return leftCount + rightCount + 1;
} else {
return leftCount + rightCount;
}
}
int main() {
TreeNode* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
root->right->left = createNode(6);
root->right->right = createNode(7);
int doubleBranchNodeCount = countDoubleBranchNodes(root);
printf("二叉树中双分支节点的数量为: %d\n", doubleBranchNodeCount);
return 0;
}
11.删除所有值为x的节点以及子树
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
if (newNode) {
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
}
return newNode;
}
void deleteSubtree(TreeNode* root) {
if(root){
deleteSubtree(root->left);
deleteSubtree(root->right);
free(root);
}
}
TreeNode* deleteNodesWithValue(TreeNode* root, int num) {
if (root) {
root->left = deleteNodesWithValue(root->left, num);
root->right = deleteNodesWithValue(root->right, num);
if (root->data == num) {
deleteSubtree(root);
return NULL;
}
return root;
}
}
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->data);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
int main() {
TreeNode* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(2);
root->right->left = createNode(2);
root->right->right = createNode(5);
int numToDelete = 2;
printf("删除前的二叉树前序遍历结果:");
preorderTraversal(root);
printf("\n");
root = deleteNodesWithValue(root, numToDelete);
printf("删除后的二叉树前序遍历结果:");
preorderTraversal(root);
printf("\n");
return 0;
}
12.寻找值为x所有祖先
1.递归实现
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
if (newNode) {
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
}
return newNode;
}
int findAncestors(TreeNode* root, int x) {
if (root == NULL) {
return 0;
}
if (root->data == x) {
return 1;
}
int foundInLeft = findAncestors(root->left, x);
if (foundInLeft || findAncestors(root->right, x)) {
printf("%d ", root->data);
return 1;
}
return 0;
}
int main() {
TreeNode* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
root->right->left = createNode(6);
root->right->right = createNode(7);
int x = 5;
printf("值为 %d 的节点的所有祖先是:\n", x);
findAncestors(root, x);
printf("\n");
return 0;
}
2.非递归(没理解)
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
if (newNode) {
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
}
return newNode;
}
void findAncestors(TreeNode* root, int x) {
if (root == NULL) {
printf("未找到节点 %d\n", x);
return;
}
TreeNode* stack[100];
int top = -1;
TreeNode* current = root;
TreeNode* prev = NULL;
while (current || top != -1) {
while (current) {
stack[++top] = current;
current = current->left;
}
current = stack[top];
if (current->right && current->right != prev) {
current = current->right;
} else {
if (current->data == x) {
printf("值为 %d 的节点的祖先是:", x);
for (int i = 0; i < top; i++) {
printf("%d ", stack[i]->data);
}
printf("\n");
return;
}
prev = current;
top--;
current = NULL;
}
}
printf("未找到节点 %d\n", x);
}
int main() {
TreeNode* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
root->right->left = createNode(6);
root->right->right = createNode(7);
root->left->left->left = createNode(8);
root->left->left->right = createNode(9);
root->left->right->left = createNode(10);
root->left->right->right = createNode(11);
int x = 10;
findAncestors(root, x);
return 0;
}
13.寻找两节点公共祖先
1.递归
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
if (newNode) {
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
}
return newNode;
}
TreeNode* findLowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == NULL) {
return NULL;
}
if (root == p || root == q) {
return root;
}
TreeNode* left = findLowestCommonAncestor(root->left, p, q);
TreeNode* right = findLowestCommonAncestor(root->right, p, q);
if (left && right) {
return root;
}
return left ? left : right;
}
int main() {
TreeNode* root = createNode(3);
root->left = createNode(5);
root->right = createNode(1);
root->left->left = createNode(6);
root->left->right = createNode(2);
root->right->left = createNode(0);
root->right->right = createNode(8);
root->left->right->left = createNode(7);
root->left->right->right = createNode(4);
TreeNode* p = root->left->right->left;
TreeNode* q = root->left->right->right;
TreeNode* ancestor = findLowestCommonAncestor(root, p, q);
if (ancestor) {
printf("节点 %d 和节点 %d 的最近公共祖先是节点 %d\n", p->data, q->data, ancestor->data);
} else {
printf("未找到节点 %d 和节点 %d 的最近公共祖先\n", p->data, q->data);
}
return 0;
}
2.非递归(未实现)
19.所有叶子节点带权路径和
typedef struct BitNode{
int weight;
struct BitNode *lchild,*rchild;
}BitNode,*BitTree;
int wpl(BitTree root){
return wpl_preorder(root,0);
}
int wpl_preorder(BitTree root,int deep){
static int w1=0;
if(root->lchild==NULL &&root->rchild ==NULL){
w1+= deep* root->weight;
}
if(root->lchild!=NULL){
wpl_preorder(root->lchild,deep+1);
}
if(root->rchild!=NULL){
wpl_preorder(root->rchild,deep+1);
}
return w1;
}
20.字符计算转中缀并加括号
void Btree(Btree*root){
BtreeTo(root,1);
}
void BtreeTo(Btree* root,int deep){
if(root==NULL)
return ;
else if(root->left==NULL && root->right ==NULL)
printf("%d",root->data);
else{
if(deep>1) printf("(");
BtreeTo(root->left,deep+1);
printf("%s",root->data);
BtreeTo(root->right,deep+1);
if(deep>1)printf(")");
}
}
21.判断顺序存储的二叉树是否是二叉排序树
#include <stdio.h>
#include <stdlib.h>
int pre=0;
bool InOrder(SqBiTNode*bt,int i){
if(bt->SqBiTNode[i] == -1)
return true;
if(!InOrder(bt,2*i+1))
return false;
if(pre > bt->SqBiTNode[i])
return false;
pre=bt->SqBiTNode[i];
if(!InOrder(bt,2*i+2))
return false;
return true;
}
int main()
{
printf("Hello world!\n");
return 0;
}