数据结构——二叉树的创建、遍历(先序、中序、后序、层次),以及求已知结点p的前驱、后继结点

//二叉树的创建、遍历以及求结点p的前驱、后继结点

#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode{
	int data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

BiTree CreateBTree(BiTree T, bool isRoot){//创建一个二叉树  #代表空节点 
    char ch;
    if (isRoot)
        printf("Root: ");
    fflush(stdin);
	scanf("%c", &ch);
	fflush(stdin);
	
    if (ch != '#'){
        isRoot = false;
        T = new BiTNode;
        T->data = ch;  
        T->lchild = NULL;
        T->rchild = NULL;
        printf("%c's left child is: ", T->data);
        T->lchild = CreateBTree(T->lchild, isRoot);
        printf("%c's right child is: ", T->data);
        T->rchild = CreateBTree(T->rchild, isRoot);
    }
    return T;
}

void visit1(BiTree T){	//输出结点值 

	printf("%c ",T->data); 

}

void PreOrder(BiTree T){ //先序遍历
	if(T!=NULL){
		visit1(T);
		PreOrder(T->lchild);
		PreOrder(T->rchild); 	
	}
} 

void InOrder(BiTree T){//中序遍历
	if(T!=NULL){
		PreOrder(T->lchild);
		visit1(T);
		PreOrder(T->rchild);
	} 
}

void PostOrder(BiTree T){//后序遍历
	if(T!=NULL){
		PreOrder(T->lchild);
		PreOrder(T->rchild);
		visit1(T);
	} 
}

/*	关于队列的相关操作见https://blog.csdn.net/qq_40280704/article/details/106802197 

void LevelOrder(BiTree T){//层次遍历 
	InitQueue(Q);	//辅助队列	
	BiTree p;
	EnQueue(Q,T);
	while(!IsEmpty(Q)){
		DeQueue(Q,p);
		visit1(p);
		if(p->lchild!= NULL){
			EnQueue(Q,p->lchild);
		}
		if(p->rchild!=NUll){
			EnQueue(Q,p->rchild);
		}
	} 
} 
*/ 

/*
BiTNode *p;//p指向目标节点
BiTNode *pre = NULL;//pre指向访问结点的前驱结点
BiTNode *final = NULL;//用于记录最终结果 

//中序遍历访问p结点的前驱结点final:  (若访问p的后继结点,则pre == p时,final=q 
void visit2(BiTNode *q){
	if(p==q){
		final=pre;
	}
	else{
		pre=q;
	}
} 

void PreInOrder(BiTree T){
	if(T!=NULL){
		PreInOrder(T->lchild);
		visit2(T);
		PreInOrder(T->rchild);
	}
} 
*/
int main(){
	BiTree T ;
	T = CreateBTree (T,true);
	printf("中序遍历结果为:");
	InOrder(T);
	return 0;
}
1. 二叉树的递归先序遍历: 先访问根节点,然后遍历左子树,最后遍历右子树。 代码实现: ``` void preOrder(TreeNode* root) { if (root == nullptr) { return; } cout << root->val << " "; // 访问根节点 preOrder(root->left); // 遍历左子树 preOrder(root->right); // 遍历右子树 } ``` 2. 二叉树的递归中序遍历: 先遍历左子树,然后访问根节点,最后遍历右子树。 代码实现: ``` void inOrder(TreeNode* root) { if (root == nullptr) { return; } inOrder(root->left); // 遍历左子树 cout << root->val << " "; // 访问根节点 inOrder(root->right); // 遍历右子树 } ``` 3. 二叉树的递归后序遍历: 先遍历左子树,然后遍历右子树,最后访问根节点。 代码实现: ``` void postOrder(TreeNode* root) { if (root == nullptr) { return; } postOrder(root->left); // 遍历左子树 postOrder(root->right); // 遍历右子树 cout << root->val << " "; // 访问根节点 } ``` 4. 二叉树的非递归层次遍历: 使用一个队列来存储每一层的节点,先将根节点入队,然后遍历队列的元素,将每个元素的左右子节点入队,直到队列为空。 代码实现: ``` void levelOrder(TreeNode* root) { if (root == nullptr) { return; } queue<TreeNode*> q; q.push(root); while (!q.empty()) { TreeNode* node = q.front(); q.pop(); cout << node->val << " "; if (node->left != nullptr) { q.push(node->left); } if (node->right != nullptr) { q.push(node->right); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值