- 1、本文档共62页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
4.2.2 二叉树 2)二叉树的链式存储 通过非递归的方式构建一个顺序二叉树,二叉树中每个节点都是一个char型的数据,这个二叉树遵循以下规则。图4.14 实例构建的二叉树 所有右孩子的数值大于根节点。 所有左孩子的数值小于根节点。 这样,为了方便起见,先设定一个数据集合及构建顺序,如下所示(数据的构建顺序自左向右):e、f、h、g、a、c、b、d。与此相对应的二叉树如图4.14所示。 4.2.2 二叉树 /*二叉树节点的结构体*/ struct _tree_node { char data; struct tree_node *lchild; struct tree_node *rchild; }; typedef struct _tree_node tree_node; /* 初始化二叉树的每个节点,在此处要注意将该节点的左右孩子都赋值为NULL */ void tree_init(tree_node **node) { *node = (tree_node *)malloc(sizeof(tree_node)); (*node)-lchild = (*node)-rchild = NULL; (*node)-data = 0; } 4.2.2 二叉树 /* 二叉树构建函数,data是要构建的节点的数值,node是根节点 */ void construct(char data, tree_node **node) { int i; Node *temp_node = *node; while(temp_node) {/*判断该节点数据是否为空,该情况只在插入根节点的时候出现*/ if (!temp_node-data) { temp_node-data = data; break; } /* 若要插入的数据小于该节点,则进入循环体 */ else if(data = temp_node-data) {/* 若该节点的左孩子为空,则初始化其左孩子 */ if (!temp_node-lchild) { tree_init(temp_node-lchild); temp_node-lchild-data = data; break; } /*若该节点的左孩子非空,则继续比较*/ else{ temp_node = temp_node-lchild; continue;} } /* 此处的情况与上一个else if类似 */ else if (data temp_node-data) {if (!temp_node-rchild) { tree_init(temp_node-rchild); temp_node-rchild-data = data; break; }else{ temp_node = temp_node-rchild; continue; } } } return; } 4.2.2 二叉树 4)二叉树的常见操作 (1)遍历二叉树 所谓遍历二叉树就是按某种顺序访问二叉树中的每个节点一次且仅一次的过程。这里的访问可以是输出、比较、更新、查看元素内容等操作。 二叉树的遍历方式分为两大类: 一类按根、左子树和右子树3个部分进行访问; 另一类按层次访问。 TLR(根左右) LTR(左根右) LRT(左右根) 4.2.2 二叉树 ① 先序遍历的流程: 若二叉树为空,则结束遍历操作; 访问根节点; 先序遍历左子树; 先序遍历右子树。 int pre_order_traverse(tree_node *node) { if (!node) { return 1; } /* 访问根节点 */ printf(%c , node-data); /* 先序遍历左子树 */ pre_order_traverse(node-lchild); /*先序遍历右子树*/ pre_order_traverse(node-rchild); return 0; } 先序序列:e a c b d f h g 4.2.2 二叉树 ②中序遍历的流程: 若二叉树为空,则结束遍历操作; 中序遍历左子树; 访问根节点; 中序遍历右子树。 int in_order_traverse(tree_node * node) { if (!tree_node) { return 1; } /* 中序遍历左子树 */ in_order_traverse(node-lchild)); /* 访问根节点 */ printf(
文档评论(0)