二叉树的原始构造与前 中 后序遍历

 

 

// 遍历时 不要忘记对t是否为空的判断

#include<iostream>
using namespace std;

typedef struct TreeNode
{
	int val;
	TreeNode * lchild;
	TreeNode * rchild;
}TrNode;
//先序遍历
void preOrder(TrNode *t)
{
	if (!t) return;
	cout << t->val << endl;
	preOrder(t->lchild);
	preOrder(t->rchild);
}
//中序遍历
void inOrder(TrNode *t)
{
	if (!t) return;
	inOrder(t->lchild);
	cout << t->val << endl;
	inOrder(t->rchild);
}
//后序遍历
void postOrder(TrNode *t)
{
	if (!t) return;
	postOrder(t->lchild);	
	postOrder(t->rchild);
	cout << t->val << endl;
}
int main()
{
	//最原始的方法构建二叉树
	TrNode *t1, *t2, *t3, *t4, *t5;
	t1 = (TrNode*)malloc(sizeof(TrNode));
	t2 = (TrNode*)malloc(sizeof(TrNode));
	t3 = (TrNode*)malloc(sizeof(TrNode));
	t4 = (TrNode*)malloc(sizeof(TrNode));
	t5 = (TrNode*)malloc(sizeof(TrNode));
	t1->val = 1;
	t2->val = 2;
	t3->val = 3;
	t4->val = 4;
	t5->val = 5;
	t1->lchild = t2;
	t1->rchild = t3;
	t2->lchild = t4;
	t2->rchild = NULL;
	t3->rchild = t5;
	t3->lchild = NULL;
	t4->rchild = NULL;
	t4->lchild = NULL;
	t5->rchild = NULL;
	t5->lchild = NULL;
	cout << "先序遍历" << endl;
	preOrder(t1);
	cout << "中序遍历" << endl;
	inOrder(t1);
	cout << "后序遍历" << endl;
	postOrder(t1);
	system("pause");
	return 0;
}
先序遍历
1
2
4
3
5
中序遍历
4
2
1
3
5
后序遍历
4
2
5
3
1
请按任意键继续. . .

//计算树的叶节点的数目:叶节点(既没有左子树也没有右子树)

定义一个全局变量 leafNodeNum   函数调用 countLeafNode(t1)

void countLeafNode(TrNode *t)
{
	
	if (!t) return;
	if (!t->lchild && !t->rchild) leafNodeNum++;
	countLeafNode(t->lchild);
	countLeafNode(t->rchild);
}

//计算树的高度   函数调用 int hight = treeHight(t1)

//计算树的高度
int treeHight(TrNode *t)
{
	int depthLeft = 0;
	int depthRight = 0;
	int depVal = 0;
	if (!t) return 0;
	depthLeft = treeHight(t->lchild); //求左子树的高度
	depthRight = treeHight(t->rchild); //求右子树的高度
	depVal = 1 + ((depthLeft > depthRight) ? depthLeft : depthRight);//注意加1
	return depVal;
}

//copy树 

调用 TrNode *newTree = CopyTree(t1);
        preOrder(newTree);//前序遍历进行验证

//Copy树
TrNode* CopyTree(TrNode *t)
{
	if (!t) return NULL;
	TrNode *newLp = NULL;//新建左子树
	TrNode *newRp = NULL;//新建右子树
	TrNode *newNode = NULL;//新建头结点
	if (t->lchild)
	{
		newLp = CopyTree(t->lchild);//如果左子树存在,那么继续copy左子树
	}
	if (t->rchild)  //如果右子树存在,那么继续copy右子树
	{
		newRp = CopyTree(t->rchild);
	}
	newNode = (TrNode*)malloc(sizeof(TrNode));
	newNode->lchild = newLp;
	newNode->rchild = newRp;
	newNode->val = t->val;
	return newNode;
}

//非递归的形式遍历二叉树(中序)  利用栈

思路:(1)如果节点有左子树,那么该节点入栈,如果没有左子树,访问该节点

        (2)如果节点有右子树,重复步骤(1)

       (3)如果节点没有右子树(节点访问完毕)从栈顶回退

TrNode *goLeft(TrNode *t, stack<TrNode*> s)
{
	if (!t) return NULL;
	while (t)
	{
		s.push(t); //如果某节点左子树存在 那么该节点入栈
		t = t->lchild;
	}
	return t;
}

void inOrder(TrNode *t1)
{
	stack<TrNode*> s;//用于存储存在左子树的节点
	//先找到t的左子树中 没有左子树的节点 如果某节点左子树存在 那么该节点入栈 
	TrNode *t = goLeft(t1, s);
	while (t)
	{
		cout << t->val << endl;
		if (t->rchild)
		{
			t = goLeft(t->rchild,s);
		}
		else if (!s.empty())
		{
			t = s.top();
			s.pop();
		}
		else
		{
			t = NULL;
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的C语言程序,实现了二叉树的创建和后序遍历: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构体 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; // 创建二叉树 struct TreeNode* createTree() { int val; scanf("%d", &val); if (val == -1) { return NULL; } struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); node->val = val; node->left = createTree(); node->right = createTree(); return node; } // 序遍历 void preorderTraversal(struct TreeNode* root) { if (!root) { return; } printf("%d ", root->val); preorderTraversal(root->left); preorderTraversal(root->right); } // 序遍历 void inorderTraversal(struct TreeNode* root) { if (!root) { return; } inorderTraversal(root->left); printf("%d ", root->val); inorderTraversal(root->right); } // 后序遍历 void postorderTraversal(struct TreeNode* root) { if (!root) { return; } postorderTraversal(root->left); postorderTraversal(root->right); printf("%d ", root->val); } int main() { struct TreeNode* root = createTree(); printf("序遍历:"); preorderTraversal(root); printf("\n序遍历:"); inorderTraversal(root); printf("\n后序遍历:"); postorderTraversal(root); printf("\n"); return 0; } ``` 在程序,我们定义了一个二叉树节点的结构体,包括节点的值,以及左右子节点。然后我们通过递归的方式来创建二叉树,递归函数返回的是当节点。 在遍历二叉树时,分别实现了序遍历、序遍历和后序遍历的函数。这些函数也都是通过递归来实现的。在遍历过程,先输出当节点的值,然后遍历左子树,最后遍历右子树(序遍历);或者先遍历左子树,然后输出当节点的值,最后遍历右子树(序遍历);或者先遍历左子树,然后遍历右子树,最后输出当节点的值(后序遍历)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值