建立二叉树时按先序输入的结点序列为: abc000de0f00g00。
下面是建立二叉树的二叉链表表示,并使用非递归后序遍历二叉树的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char ElementType;
typedef struct TreeNode *BinaryTree;
struct TreeNode {
ElementType data;
BinaryTree left;
BinaryTree right;
};
BinaryTree CreateBinaryTree(char *str) {
BinaryTree t;
char c = *str;
if (c == '\0') return NULL;
t = (BinaryTree)malloc(sizeof(struct TreeNode));
t->data = c;
t->left = CreateBinaryTree(str + 1);
t->right = CreateBinaryTree(str + 1 + strlen(t->left));
return t;
}
void NonRecursivePostOrder(BinaryTree t) {
BinaryTree stack[100];
int top = -1;
BinaryTree p = t;
while (p != NULL || top >= 0) {
while (p != NULL) {
stack[++top] = p;
p = p->left;
}
if (top > 0) {
if (stack[top - 1]->right == NULL) {
p = stack[--top];
printf("%c ", p->data);
while (top >= 0 && stack[top]->right == p) {
p = stack[top--];
printf("%c ", p->data);
}
}
if (top >= 0) p = stack[top]->right;
}
else p = NULL;
}
}
int main() {
char str[] = "abc000de0f00g00";
BinaryTree t = CreateBinaryTree(str);
NonRecursivePostOrder(t);
printf("\n");
return 0;
}
下面是建立二叉树的三叉链表表示,并使用无栈非递归后序遍历二叉树的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char ElementType;
typedef struct TreeNode *BinaryTree;
struct TreeNode {
ElementType data;
BinaryTree left;
BinaryTree right;
BinaryTree middle;
};
BinaryTree CreateBinaryTree(char *str) {
BinaryTree t;
char c = *str;
if (c == '\0') return NULL;
t = (BinaryTree)malloc(sizeof(struct TreeNode));
t->data = c;
t->left = CreateBinaryTree(str + 1);
t->middle = CreateBinaryTree(str + 1 + strlen(t->left));
t->right = CreateBinaryTree(str + 1 + strlen(t->left) + strlen(t->middle));
return t;
}
void NonRecursivePostOrder(BinaryTree t) {
BinaryTree p = t;
BinaryTree q = NULL;
while (p != NULL) {
while (p->left != NULL) {
p->left->right = p;
p = p->left;
}
while (p->right == NULL || p->right == q) {
printf("%c ", p->data);
q = p;
if (p->middle != NULL) {
p = p->middle;
break;
}
p = p->right;
}
if (p->right != NULL) {
p->right->left = p;
p = p->right;
}
}
}
int main() {
char str[] = "abc000de0f00g00";
BinaryTree t = CreateBinaryTree(str);
NonRecursivePostOrder(t);
printf("\n");
return 0;
}
希望这些代码能帮到你!
// Q1054302.cpp : Defines the entry point for the console application.
//
#include<stdio.h>
#include<stdlib.h>
typedef struct treeNode//定义
{
int data;
treeNode *left;
treeNode *right;
} treenode, *TreeNode;
void pre(TreeNode node)//前序遍历
{
if(node==NULL)
return ;
printf("%d ", node->data);
pre(node->left);
pre(node->right);
}
void mid(TreeNode node)//中序遍历
{
if(node==NULL)
return ;
mid(node->left);
printf("%d ", node->data);
mid(node->right);
}
void beh(TreeNode node)//后序遍历
{
if(node==NULL)
return ;
beh(node->left);
beh(node->right);
printf("%d ", node->data);
}
void tree(TreeNode one)//定义一个现成的二叉树
{
one->data=3;
one->left=(treenode*)malloc(sizeof(treenode));
one->left->data=9;
one->left->left=NULL;
one->left->right=NULL;
one->right=(treenode*)malloc(sizeof(treenode));
one->right->data=20;
one->right->left=(treenode*)malloc(sizeof(treenode));
one->right->left->data=15;
one->right->left->left=NULL;
one->right->left->right=NULL;
one->right->right=(treenode*)malloc(sizeof(treenode));
one->right->right->data=7;
one->right->right->left=NULL;
one->right->right->right=NULL;
}
int main()//主方法
{
TreeNode one;
one=(treenode*)malloc(sizeof(treenode));
tree(one);
printf("该二叉树的前序遍历为:\n");
pre(one);
printf("\n该二叉树的中序遍历为:\n");
mid(one);
printf("\n该二叉树的后序遍历为:\n");
beh(one);
}
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct BiTreeNode
{
char data;
struct BiTreeNode *left;
struct BiTreeNode *right;
}BiTreeNode,*BiTree;
void CreateBiTree(BiTree *T)
{
char val;
scanf("%c",&val);
if(val == '#')
*T = NULL;
else
{
*T = (BiTree)malloc(sizeof(BiTreeNode));
(*T)->data = val;
CreateBiTree(&(*T)->left);
CreateBiTree(&(*T)->right);
}
}
void PreOrderTravel(BiTree T)
{
if(T==NULL)
return;
printf("%c ",T->data);
PreOrderTravel(T->left);
PreOrderTravel(T->right);
}
void TailOrderTravel(BiTree T)
{
if(T==NULL)
return;
TailOrderTravel(T->left);
TailOrderTravel(T->right);
printf("%c ",T->data);
}
int main()
{
printf("请输入测试代码:\n");
BiTree T;
T=(BiTree)malloc(sizeof(BiTreeNode));
printf("请将二叉树按照先序方式依次输入结点的值(空结点为#):\n");
CreateBiTree(&T);
printf("先序方式遍历结果:\n");
PreOrderTravel(T);
printf("\n");
printf("后序方式遍历结果:\n");
TailOrderTravel(T);
printf("\n");
return 0;
}
望采纳,谢谢
chatgpt可以解决你的问题[🐩]
三叉链表就是比二叉链表的结点多存储一个指向本结点双亲的指针,其他没啥区别。
// Q1054302.cpp : Defines the entry point for the console application.
//
#include<stdio.h>
#include<stdlib.h>
typedef struct treeNode//定义
{
int data;
treeNode *left;
treeNode *right;
} treenode, *TreeNode;
void pre(TreeNode node)//前序遍历
{
if(node==NULL)
return ;
printf("%d ", node->data);
pre(node->left);
pre(node->right);
}
void mid(TreeNode node)//中序遍历
{
if(node==NULL)
return ;
mid(node->left);
printf("%d ", node->data);
mid(node->right);
}
void beh(TreeNode node)//后序遍历
{
if(node==NULL)
return ;
beh(node->left);
beh(node->right);
printf("%d ", node->data);
}
void tree(TreeNode one)//定义一个现成的二叉树
{
one->data=3;
one->left=(treenode*)malloc(sizeof(treenode));
one->left->data=9;
one->left->left=NULL;
one->left->right=NULL;
one->right=(treenode*)malloc(sizeof(treenode));
one->right->data=20;
one->right->left=(treenode*)malloc(sizeof(treenode));
one->right->left->data=15;
one->right->left->left=NULL;
one->right->left->right=NULL;
one->right->right=(treenode*)malloc(sizeof(treenode));
one->right->right->data=7;
one->right->right->left=NULL;
one->right->right->right=NULL;
}
int main()//主方法
{
TreeNode one;
one=(treenode*)malloc(sizeof(treenode));
tree(one);
printf("该二叉树的前序遍历为:\n");
pre(one);
printf("\n该二叉树的中序遍历为:\n");
mid(one);
printf("\n该二叉树的后序遍历为:\n");
beh(one);
}