树的遍历

树的遍历

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define m 3
#define MAXLEN 100
  
typedef char datatype;
typedef struct node {
     datatype data;
     struct node *child[m];
} node;
typedef  node *tree;
tree  CreateTree(); /*按前序遍历顺序建立一棵3度树,返回树根地址  */
void LevelOrder(tree t);    /* t为指向树根结点的指针,输出树的层次遍历序列*/
void PreOrder(tree t);    /* t为指向树根结点的指针,输出树的前序遍历序列*/
void PostOrder(tree t); /* t为指向树根结点的指针,输出树的后序遍历序列*/
int main()
{
   tree t;
   t=CreateTree();
   printf("\nthe LevelOrder is:");
   LevelOrder(t);
   printf("\nthe PreOrder is:");
   PreOrder(t);
   fflush(stdin); //fflush清空缓冲区残余信息
   printf("\nthe PostOrder is:");
   PostOrder(t);
   system("pause");
   return 0;
}
tree  CreateTree()
 {
   int i;
   char ch;
   tree t;
   if ((ch=getchar())=='#')  t=NULL;
   else{
        t=(tree) malloc (sizeof(node));
        t->data=ch;
        for (i=0;i<m;++i)
            t->child[i]= CreateTree();
    }
   return t;
}
void LevelOrder(tree t){  /* t为指向树根结点的指针,输出树的层次遍历序列
						  队列不为空->出队->依次访问p的所有子女结点,并进队并进队*/
	tree queue[MAXLEN],q;
	int front,rear;
	front=rear=0;
	printf("%c",t->data);
	queue[rear++]=t;
	while(front<rear){
		q=queue[front++];
		for(int i=0;i<m;i++){
			if(q->child[i]){
				printf("%c",q->child[i]->data);
				queue[rear++]=q->child[i];
			}
		}
	}
}
void PreOrder(tree t){ 
	int i=0;/* t为指向树根结点的指针,输出树的前序遍历序列*/
		if(t!=NULL){
			printf("%c",t->data);
			for(i=0;i<m;i++){
				PreOrder(t->child[i]);
		} 
		} 
		
}
void PostOrder(tree t){ /* t为指向树根结点的指针,输出树的后序遍历序列*/
 	 int i;
    if (t)
        {
            for (i=0;i<m;i++)
                PostOrder(t->child[i]);
            printf("%c",t->data);
        }

    }

输入样例:

ab###ce###fh###i####g###d###



输出样例:

the LevelOrder is:abcdefghi
the PreOrder is:abcefhigd
the PostOrder is:behifgcda



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是二叉的前序遍历的完整代码,包括测试和优化: ```python # 定义二叉节点类 class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right # 定义二叉类 class BinaryTree: def __init__(self, root=None): self.root = root # 前序遍历二叉递归算法 def preorder_recursive(self, node): if not node: return [] res = [node.val] res += self.preorder_recursive(node.left) res += self.preorder_recursive(node.right) return res # 前序遍历二叉迭代算法 def preorder_iterative(self): if not self.root: return [] stack, res = [self.root], [] while stack: node = stack.pop() res.append(node.val) if node.right: stack.append(node.right) if node.left: stack.append(node.left) return res # 测试 # 1 # / \ # 2 3 # / \ / \ # 4 5 6 7 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) root.right.left = TreeNode(6) root.right.right = TreeNode(7) tree = BinaryTree(root) print(tree.preorder_recursive(root)) # 期望输出: [1, 2, 4, 5, 3, 6, 7] print(tree.preorder_iterative()) # 期望输出: [1, 2, 4, 5, 3, 6, 7] ``` 代码解析: 1. 首先定义了二叉节点类 `TreeNode`,包括节点值 `val` 和左右子节点 `left` 和 `right`。 2. 定义二叉类 `BinaryTree`,包括二叉根节点 `root` 和前序遍历二叉的递归算法 `preorder_recursive` 和迭代算法 `preorder_iterative`。 3. 前序遍历二叉的递归算法是一个标准的递归函数,如果节点为空就返回一个空列表,否则分别遍历当前节点、左子节点和右子节点,将结果拼接起来返回。 4. 前序遍历二叉的迭代算法使用一个栈来辅助遍历,首先将根节点压入栈中,然后每次取出栈顶元素并将其值加入结果列表中,接着分别将其右子节点和左子节点压入栈中。由于栈是后进先出的,所以先压入左子节点,再压入右子节点,保证了遍历顺序正确。 5. 测试代码首先构建一个二叉,然后分别使用递归和迭代算法进行前序遍历,输出结果并检查是否符合期望值。 优化: 对于前序遍历二叉的递归算法和迭代算法而言,代码已经非常简洁和高效了,难以进行优化。如果要优化的话,主要是针对二叉本身的性质进行优化,例如构建平衡、使用线索二叉等,这里不再赘述。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值