二叉树基本运算

 创建头文件:#include"btree.h"

typedef char T;
typedef struct node{
	T data;
	struct node * lchild;
	struct node * rchild;	
}BTNode; 

二叉树创建思路:

假设采用括号表示法表示的二叉树字符串str是正确的,用ch扫描str,其中只有4类字符,其中处理方式如下:

  •  若ch="(":表示前面刚创建的节点*p存在孩子节点,需要将其进入堆栈,以便建立它和其孩子节点的关系。(如果一个节点刚创建完毕,其后一个字符不是左括号,表示该节点时叶子节点,不需要将其进入堆栈)。然后开始处理该节点的左孩子,因此置k=1,表示其后创建的节点将作为这个节点(栈顶节点)的左孩子节点。
  • 若ch=")",表示以栈顶节点为根节点的子树创建完毕,将其退栈。
  • 若ch=",",表示开始处理栈顶节点的右孩子节点。
  • 其他情况:只能是单个字符,表示要创建一个节点*p,根据k值建立它与栈顶节点之间的联系,当k=1时,表示这个节点是栈顶节点的左孩子节点,当k=2时,表示这个节点时栈顶节点的右孩子节点。

如此循环,直到str处理完毕,算法中使用一个St栈保存双亲节点,top为栈顶指针,k指定其后处理的节点是双亲节点(栈顶节点)的左孩子(k=1)还是右孩子(k=2)。

创建源文件:#include"btree.cpp"

#include"btree.h"
#include<malloc.h>
#include<stdio.h>
#define MaxSize 100

//创建二叉树
void CreateBTNode(BTNode * &b, char * str){
	BTNode * St[MaxSize], *p;
	int top = -1, k, j = 0;
	b = NULL;
	char ch = str[j];
	while(ch != '\0'){
		switch(ch){
			case '(': top++; St[top] = p; k = 1; break;
			case ')': top--; break;
			case ',': k = 2; break;
			default: p = (BTNode *)malloc(sizeof(BTNode));
					 p->data = ch; p->lchild = p->rchild = NULL;
					 if( b == NULL){
					 	b = p;
					 } else {
					 	switch(k){
					 		case 1: St[top]->lchild = p; break;
					 		case 2: St[top]->rchild = p; break;
					 	}
					 }
		}
		j++;
		ch = str[j];
	}
} 

//输出二叉树
void DispBTNode(BTNode * b){
	if(b != NULL){
		printf("%c", b->data);
		if(b->lchild != NULL || b ->rchild != NULL){
			printf("(");
			DispBTNode(b->lchild);
			if(b->rchild != NULL){
				printf(",");
			}
			DispBTNode(b->rchild);
			printf(")");
		}
	}
} 

//查找节点
BTNode *FindNode(BTNode * b, T x){
	BTNode * p;
	if(b == NULL){
		return NULL;
	}else if(b->data == x){
		return b;
	}else{
		p = FindNode(b->lchild, x);
		if(p != NULL){
			return p;
		} else{
			return FindNode(b->rchild, x);
		}
	}
}

//查找左孩子节点
BTNode * LchildNode(BTNode * p){
	return p->lchild;
} 

//查找右孩子节点
BTNode * RchildNode(BTNode * p){
	return p->rchild;
} 

//求二叉树的高度
int BTNodeHeight(BTNode * b){
	int lchild, rchild;
	if(b == NULL){
		return 0;
	}else{
		lchild = BTNodeHeight(b->lchild);
		rchild = BTNodeHeight(b->rchild);
		return(lchild > rchild)?(lchild + 1):(rchild + 1);
	}
} 

创建测试文件:

#include<stdio.h>
#include"btree.cpp"

int main()
{
	BTNode *b;
	CreateBTNode(b,"A(B(D,E),C(,F))");
	printf("btree:");
	DispBTNode(b);
	printf("\n");
	char x = 'B';
	BTNode * p = b;
	printf("Find->%c=%c\n", x, *FindNode(b, x)); 
	printf("%c->lchildNode=", *p);
	printf("%c\n", *LchildNode(p));
	printf("%c->rchildNode=", *p);
	printf("%c\n", *RchildNode(p));
	printf("btreeHight=%d\n", BTNodeHeight(b));
	return 0;
}

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是用C语言实现二叉树基本运算算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结构体 typedef struct Node { int data; // 数据域 struct Node *left; // 左子节点指针 struct Node *right; // 右子节点指针 } Node; // 创建节点 Node *createNode(int data) { Node *node = (Node *) malloc(sizeof(Node)); node->data = data; node->left = NULL; node->right = NULL; return node; } // 插入节点 Node *insertNode(Node *root, int data) { // 如果根节点为空,则新建一个节点作为根节点 if (root == NULL) { root = createNode(data); } // 如果数据小于根节点的数据,则插入到左子树 else if (data < root->data) { root->left = insertNode(root->left, data); } // 如果数据大于等于根节点的数据,则插入到右子树 else { root->right = insertNode(root->right, data); } return root; } // 查找节点 Node *findNode(Node *root, int data) { // 如果根节点为空,则返回NULL if (root == NULL) { return NULL; } // 如果数据等于根节点的数据,则返回根节点 else if (data == root->data) { return root; } // 如果数据小于根节点的数据,则在左子树中查找 else if (data < root->data) { return findNode(root->left, data); } // 如果数据大于根节点的数据,则在右子树中查找 else { return findNode(root->right, data); } } // 删除节点 Node *deleteNode(Node *root, int data) { Node *temp; if (root == NULL) { return NULL; } else if (data < root->data) { root->left = deleteNode(root->left, data); } else if (data > root->data) { root->right = deleteNode(root->right, data); } else { if (root->left == NULL) { temp = root->right; free(root); return temp; } else if (root->right == NULL) { temp = root->left; free(root); return temp; } else { temp = root->right; while (temp->left != NULL) { temp = temp->left; } root->data = temp->data; root->right = deleteNode(root->right, temp->data); } } return root; } // 中序遍历 void inorderTraversal(Node *root) { if (root != NULL) { inorderTraversal(root->left); printf("%d ", root->data); inorderTraversal(root->right); } } int main() { Node *root = NULL; // 插入节点 root = insertNode(root, 5); root = insertNode(root, 3); root = insertNode(root, 8); root = insertNode(root, 2); root = insertNode(root, 4); root = insertNode(root, 7); root = insertNode(root, 9); // 中序遍历 printf("Inorder traversal: "); inorderTraversal(root); printf("\n"); // 查找节点 Node *node = findNode(root, 4); if (node != NULL) { printf("Node found: %d\n", node->data); } else { printf("Node not found\n"); } // 删除节点 root = deleteNode(root, 5); // 中序遍历 printf("Inorder traversal: "); inorderTraversal(root); printf("\n"); return 0; } ``` 以上代码实现了二叉树基本操作,包括创建节点、插入节点、查找节点、删除节点和中序遍历等。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值