二叉树中序遍历 (C语言实现)

在计算机科学中,树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构。二叉树是每个节点最多有两个子树的有序树。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。

如下是实现创建二叉树和二叉树中序遍历的代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <memory.h>
 4
 5 typedef struct _tree_node{
 6     char data;
 7     struct _tree_node * left;
 8     struct _tree_node * right;
 9     struct _tree_node * father;
10 }tree_node;
11
12 void createTree(tree_node * root);
13 void inorderTraverseTree(tree_node * pRoot);
14
15 int main()
16 {
17     tree_node root;
18     memset(&root, 0 , sizeof(tree_node));
19     printf("Please create the tree: \n");
20     createTree(&root);
21     printf("The inorder traverse result is: \n");
22     inorderTraverseTree(&root);
23     return 0;
24 }
25
26 //inorder traversal
27 void inorderTraverseTree(tree_node * pRoot)
28 {
29     tree_node * pCur = pRoot;
30     if(pCur != NULL)
31     {
32         if(pCur->left != NULL)
33         {
34             inorderTraverseTree(pCur->left);
35         }
36         else
37         {
38             printf("%c ", pCur->data);
39             return;
40         }
41         printf("%c ", pCur->data);
42
43         if(pCur->right != NULL)
44         {
45             inorderTraverseTree(pCur->right);
46         }
47     }
48 }
49
50 //Create the binary tree
51 void createTree(tree_node * pRoot)
52 {
53     char ch = 0;
54     tree_node * pCur = pRoot;
55     while((ch = getchar())!= ‘e‘)
56     {
57         //printf("%c" , ch);
58         tree_node * pNewNode = (tree_node *)malloc(sizeof(tree_node));
59         pNewNode->left = NULL;
60         pNewNode->right = NULL;
61         pNewNode->father = NULL;
62         if(ch == ‘L‘)
63         {
64             //printf("Input L\n");
65             pNewNode->data = getchar();
66             pNewNode->father = pCur;
67             pCur->left = pNewNode;
68             pCur = pNewNode;
69         }
70         else if(ch == ‘R‘)
71         {
72             //printf("Input R\n");
73             pNewNode->data = getchar();
74             pNewNode->father = pCur;
75             pCur->right = pNewNode;
76             pCur = pNewNode;
77         }
78         else if(ch == ‘B‘)
79         {
80             //printf("Input B\n");
81             free(pNewNode);
82             if(pCur->father != NULL)
83                 pCur = pCur->father;
84             else
85                 printf("It‘s the top\n");
86         }
87     }
88 }

构造这样一颗二叉树:

程序运行结果为:

二叉树中序遍历 (C语言实现)

时间: 2024-10-11 18:56:48

二叉树中序遍历 (C语言实现)的相关文章

Leetcode: Binary Tree Inorder Traversal(二叉树中序遍历)

题目: Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [1,3,2]. Note: Recursive solution is trivial, could you do it iteratively? 递归解法(C++): /** * Definition for binary tre

94 Binary Tree Inorder Traversal(二叉树中序遍历Medium)

题目意思:二叉树中序遍历,结果存在vector<int>中 解题思路:迭代 迭代实现: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Soluti

【LeetCode-面试算法经典-Java实现】【094-Binary Tree Inorder Traversal(二叉树中序遍历)】

[094-Binary Tree Inorder Traversal(二叉树中序遍历)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree, return the inorder traversal of its nodes' values. 题目大意 对一棵二叉树进行中序遍历. 解题思路 解法一:递归实现,解法二:迭代实现. 代码实现 二叉树结点类 public class TreeNode { int val; TreeNod

leetCode 94.Binary Tree Inorder Traversal(二叉树中序遍历) 解题思路和方法

Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [1,3,2]. Note: Recursive solution is trivial, could you do it iteratively? confused what "{1,#,2,3}" means? > rea

二叉树中序遍历的下一个节点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路:分多种情况讨论 1 /* 2 struct TreeLinkNode { 3 int val; 4 struct TreeLinkNode *left; 5 struct TreeLinkNode *right; 6 struct TreeLinkNode *next; 7 TreeLinkNode(int x) :val(x), left(NU

【剑指offer】8、二叉树中序遍历的下一个节点

题目 给定一个二叉树和其中一个节点,找出中序遍历的下一个节点.注意:树的节点中除了有指向左右节点的指针,还有指向父节点的指针. 思路 (1)若该节点Node有右子树,则下一个节点就是右子树中的最左节点,就是在右节点中一直往左子树找. (2)若Node没有右子树 (i)Node是左子节点,则下一个节点就是node的父节点. (ii)Node是右子节点,则下一个节点就要一直向上找,找到第一个左子节点,也就是第一种情况. /* struct TreeLinkNode { int val; struct

二叉树中序遍历非递归写法

中序遍历比前序要稍微复杂些,我也先用手写理出思路 代码写的和书上的一比...感觉麻烦了好多,但毕竟是自己理的思路不容易忘,所以还是贴自己的 void inOrder_stack(BiTree T){ printf("\n非递归中序遍历结果:\n"); initStack(&sqStack); BiTree p=T,l;//l用于保存上次的输出 push(&sqStack,p); while(!stackEmpty(sqStack)){ getTop(&sqSta

二叉树中序遍历 递归 非递归

中序遍历的操作如下: 1)中序遍历左子树: 2)访问根节点: 3)中序遍历右子树: 对应的递归算法如下: void InOrder(Bitree T) { if (T != NULL) { InOrder(T->lchild); visit(T); InOrder(T->rchild); } } 对应的非递归算法如下: void InOrder2(Bitree T) { //借助栈实现 InitStack(S); Bitree p = T; //初始化栈,p是遍历指针 while (p ||

二叉树中序遍历方法实现

对于二叉树的遍历,先序的方式是比较简单的,但是中序和后序的方式还是有点麻烦的,这里先给出一个用C++stack的遍历方式: 1.如果当前结点不为空 把当前结点压入栈 p=p->left转向其左孩子 2.如果当前结点为空(证明这半棵子树已经遍历完成,需要从栈顶找到树根) 取栈顶元素为当前结点,栈做一次弹栈操作 访问当前结点 p=p->right转向其右孩子 3.重复1.2操作,直到栈为空并且当前结点为NULL,结束. 算法代码实现: vector<int> inOrder(TreeN