Tree 树遍历

Tree 树遍历

树遍历

更新于 2025/10/16 16:21:06

中序遍历

前序遍历

后序遍历

完整实现

遍历是访问树中所有节点的过程,也可能打印它们的值。由于所有节点都通过边(链接)连接,因此我们始终从根(头)节点开始。也就是说,我们无法随机访问树中的节点。我们有三种方法可以遍历一棵树 −

中序遍历

前序遍历

后序遍历

通常,我们遍历一棵树是为了在树中搜索或定位给定的元素或键,或者打印它包含的所有值。

中序遍历

在这种遍历方法中,首先访问左子树,然后访问根,最后访问右子树。我们应该始终记住,每个节点本身都可能代表一棵子树。

如果二叉树按顺序遍历,输出将按升序排列键值。

我们从A开始,按顺序遍历后,移动到它的左子树B。B也按顺序遍历。该过程持续进行,直到所有节点都被访问。这棵树按顺序遍历的输出结果为 −

D → B → E → A → F → C → G

算法

直到所有节点都遍历完毕 −

步骤 1 − 递归遍历左子树。

步骤 2 − 访问根节点。

步骤 3 − 递归遍历右子树。

示例

以下是此操作在各种编程语言中的实现 −

C

C++

Java

Python

#include

#include

struct node {

int data;

struct node *leftChild;

struct node *rightChild;

};

struct node *root = NULL;

void insert(int data){

struct node *tempNode = (struct node*) malloc(sizeof(struct node));

struct node *current;

struct node *parent;

tempNode->data = data;

tempNode->leftChild = NULL;

tempNode->rightChild = NULL;

//如果树为空

if(root == NULL) {

root = tempNode;

} else {

current = root;

parent = NULL;

while(1) {

parent = current;

//去树的左边

if(data < parent->data) {

current = current->leftChild;

//插入到左侧

if(current == NULL) {

parent->leftChild = tempNode;

return;

}

}//去树的右边

else {

current = current->rightChild;

//插入到右侧

if(current == NULL) {

parent->rightChild = tempNode;

return;

}

}

}

}

}

void inorder_traversal(struct node* root){

if(root != NULL) {

inorder_traversal(root->leftChild);

printf("%d ",root->data);

inorder_traversal(root->rightChild);

}

}

int main(){

int i;

int array[7] = { 27, 14, 35, 10, 19, 31, 42 };

for(i = 0; i < 7; i++)

insert(array[i]);

printf("中序遍历:");

inorder_traversal(root);

return 0;

}

输出

中序遍历:10 14 19 27 31 35 42

#include

struct node {

int data;

struct node *leftChild;

struct node *rightChild;

};

struct node *root = NULL;

void insert(int data){

struct node *tempNode = (struct node*) malloc(sizeof(struct node));

struct node *current;

struct node *parent;

tempNode->data = data;

tempNode->leftChild = NULL;

tempNode->rightChild = NULL;

//如果树为空

if(root == NULL) {

root = tempNode;

} else {

current = root;

parent = NULL;

while(1) {

parent = current;

//去树的左边

if(data < parent->data) {

current = current->leftChild;

//插入到左侧

if(current == NULL) {

parent->leftChild = tempNode;

return;

}

}//去树的右边

else {

current = current->rightChild;

//插入到右侧

if(current == NULL) {

parent->rightChild = tempNode;

return;

}

}

}

}

}

void inorder_traversal(struct node* root){

if(root != NULL) {

inorder_traversal(root->leftChild);

printf("%d ",root->data);

inorder_traversal(root->rightChild);

}

}

int main(){

int i;

int array[7] = { 27, 14, 35, 10, 19, 31, 42 };

for(i = 0; i < 7; i++)

insert(array[i]);

printf("中序遍历:");

inorder_traversal(root);

return 0;

}

输出

中序遍历:10 14 19 27 31 35 42

class Node {

int data;

Node leftChild;

Node rightChild;

public Node(int key) {

data = key;

leftChild = rightChild = null;

}

}

public class TreeDataStructure {

Node root = null;

void inorder_traversal(Node node) {

if(node != null) {

inorder_traversal(node.leftChild);

System.out.print(node.data + " ");

inorder_traversal(node.rightChild);

}

}

public static void main(String args[]) {

TreeDataStructure tree = new TreeDataStructure();

tree.root = new Node(27);

tree.root.leftChild = new Node(12);

tree.root.rightChild = new Node(3);

tree.root.leftChild.leftChild = new Node(44);

tree.root.leftChild.rightChild = new Node(17);

tree.root.rightChild.leftChild = new Node(56);

System.out.println("中序遍历:");

tree.inorder_traversal(tree.root);

}

}

输出

中序遍历:

44 12 17 27 56 3

class Node:

def __init__(self, key):

self.leftChild = None

self.rightChild = None

self.data = key

# 创建一个函数来执行中序树遍历

def InorderTraversal(root):

if root:

InorderTraversal(root.leftChild)

print(root.data)

InorderTraversal(root.rightChild)

# Main class

if __name__ == "__main__":

root = Node(3)

root.leftChild = Node(26)

root.rightChild = Node(42)

root.leftChild.leftChild = Node(54)

root.leftChild.rightChild = Node(65)

root.rightChild.leftChild = Node(12)

# Function call

print("二叉树的中序遍历是")

InorderTraversal(root)

输出

二叉树的中序遍历是

54

26

65

3

12

42

前序遍历

在此遍历方法中,首先访问根节点,然后访问左子树,最后访问右子树。

我们从A开始,按照前序遍历,首先访问A本身,然后移动到其左子树B。B也按前序遍历。该过程一直持续到所有节点都被访问。这棵树的前序遍历的输出为 −

A → B → D → E → C → F → G

算法

直到所有节点都遍历完毕 −

步骤 1 − 访问根节点。

步骤 2 − 递归遍历左子树。

步骤 3 − 递归遍历右子树。

示例

以下是此操作在各种编程语言中的实现 −

C

C++

Java

Python

#include

#include

struct node {

int data;

struct node *leftChild;

struct node *rightChild;

};

struct node *root = NULL;

void insert(int data){

struct node *tempNode = (struct node*) malloc(sizeof(struct node));

struct node *current;

struct node *parent;

tempNode->data = data;

tempNode->leftChild = NULL;

tempNode->rightChild = NULL;

//如果树为空

if(root == NULL) {

root = tempNode;

} else {

current = root;

parent = NULL;

while(1) {

parent = current;

//去树的左边

if(data < parent->data) {

current = current->leftChild;

//插入到左侧

if(current == NULL) {

parent->leftChild = tempNode;

return;

}

}//去树的右边

else {

current = current->rightChild;

//插入到右侧

if(current == NULL) {

parent->rightChild = tempNode;

return;

}

}

}

}

}

void pre_order_traversal(struct node* root){

if(root != NULL) {

printf("%d ",root->data);

pre_order_traversal(root->leftChild);

pre_order_traversal(root->rightChild);

}

}

int main(){

int i;

int array[7] = { 27, 14, 35, 10, 19, 31, 42 };

for(i = 0; i < 7; i++)

insert(array[i]);

printf("前序遍历:");

pre_order_traversal(root);

return 0;

}

输出

前序遍历:27 14 10 19 35 31 42

#include

struct node {

int data;

struct node *leftChild;

struct node *rightChild;

};

struct node *root = NULL;

void insert(int data){

struct node *tempNode = (struct node*) malloc(sizeof(struct node));

struct node *current;

struct node *parent;

tempNode->data = data;

tempNode->leftChild = NULL;

tempNode->rightChild = NULL;

//如果树为空

if(root == NULL) {

root = tempNode;

} else {

current = root;

parent = NULL;

while(1) {

parent = current;

//去树的左边

if(data < parent->data) {

current = current->leftChild;

//插入到左侧

if(current == NULL) {

parent->leftChild = tempNode;

return;

}

}//去树的右边

else {

current = current->rightChild;

//插入到右侧

if(current == NULL) {

parent->rightChild = tempNode;

return;

}

}

}

}

}

void pre_order_traversal(struct node* root){

if(root != NULL) {

printf("%d ",root->data);

pre_order_traversal(root->leftChild);

pre_order_traversal(root->rightChild);

}

}

int main(){

int i;

int array[7] = { 27, 14, 35, 10, 19, 31, 42 };

for(i = 0; i < 7; i++)

insert(array[i]);

printf("前序遍历:");

pre_order_traversal(root);

return 0;

}

输出

前序遍历:27 14 10 19 35 31 42

class Node {

int data;

Node leftChild;

Node rightChild;

public Node(int key) {

data = key;

leftChild = rightChild = null;

}

}

public class TreeDataStructure {

Node root = null;

void pre_order_traversal(Node node) {

if(node != null) {

System.out.print(node.data + " ");

pre_order_traversal(node.leftChild);

pre_order_traversal(node.rightChild);

}

}

public static void main(String args[]) {

TreeDataStructure tree = new TreeDataStructure();

tree.root = new Node(27);

tree.root.leftChild = new Node(12);

tree.root.rightChild = new Node(3);

tree.root.leftChild.leftChild = new Node(44);

tree.root.leftChild.rightChild = new Node(17);

tree.root.rightChild.leftChild = new Node(56);

System.out.println("前序遍历:");

tree.pre_order_traversal(tree.root);

}

}

输出

前序遍历:

27 12 44 17 3 56

class Node:

def __init__(self, key):

self.leftChild = None

self.rightChild = None

self.data = key

# 创建一个函数来执行后序树遍历

def PreorderTraversal(root):

if root:

print(root.data)

PreorderTraversal(root.leftChild)

PreorderTraversal(root.rightChild)

# Main class

if __name__ == "__main__":

root = Node(3)

root.leftChild = Node(26)

root.rightChild = Node(42)

root.leftChild.leftChild = Node(54)

root.leftChild.rightChild = Node(65)

root.rightChild.leftChild = Node(12)

print("二叉树的前序遍历是")

PreorderTraversal(root)

输出

二叉树的前序遍历是

3

26

54

65

42

12

后序遍历

在这种遍历方法中,根节点最后被访问,因此得名。我们首先遍历左子树,然后是右子树,最后是根节点。

我们从A开始,按照前序遍历,首先访问左子树B。B也按后序遍历。该过程一直持续到所有节点都被访问。这棵树的后序遍历输出为 −

D → E → B → F → G → C → A

算法

直到所有节点都遍历完毕 −

步骤 1 − 递归遍历左子树。

步骤 2 − 递归遍历右子树。

步骤 3 − 访问根节点。

示例

以下是此操作在各种编程语言中的实现 −

C

C++

Java

Python

#include

#include

struct node {

int data;

struct node *leftChild;

struct node *rightChild;

};

struct node *root = NULL;

void insert(int data){

struct node *tempNode = (struct node*) malloc(sizeof(struct node));

struct node *current;

struct node *parent;

tempNode->data = data;

tempNode->leftChild = NULL;

tempNode->rightChild = NULL;

//如果树为空

if(root == NULL) {

root = tempNode;

} else {

current = root;

parent = NULL;

while(1) {

parent = current;

//去树的左边

if(data < parent->data) {

current = current->leftChild;

//插入到左侧

if(current == NULL) {

parent->leftChild = tempNode;

return;

}

}//去树的右边

else {

current = current->rightChild;

//插入到右侧

if(current == NULL) {

parent->rightChild = tempNode;

return;

}

}

}

}

}

void post_order_traversal(struct node* root){

if(root != NULL) {

post_order_traversal(root->leftChild);

post_order_traversal(root->rightChild);

printf("%d ", root->data);

}

}

int main(){

int i;

int array[7] = { 27, 14, 35, 10, 19, 31, 42 };

for(i = 0; i < 7; i++)

insert(array[i]);

printf("后序遍历:");

post_order_traversal(root);

return 0;

}

输出

后序遍历:10 19 14 31 42 35 27

#include

struct node {

int data;

struct node *leftChild;

struct node *rightChild;

};

struct node *root = NULL;

void insert(int data){

struct node *tempNode = (struct node*) malloc(sizeof(struct node));

struct node *current;

struct node *parent;

tempNode->data = data;

tempNode->leftChild = NULL;

tempNode->rightChild = NULL;

//如果树为空

if(root == NULL) {

root = tempNode;

} else {

current = root;

parent = NULL;

while(1) {

parent = current;

//去树的左边

if(data < parent->data) {

current = current->leftChild;

//插入到左侧

if(current == NULL) {

parent->leftChild = tempNode;

return;

}

}//去树的右边

else {

current = current->rightChild;

//插入到右侧

if(current == NULL) {

parent->rightChild = tempNode;

return;

}

}

}

}

}

void post_order_traversal(struct node* root){

if(root != NULL) {

post_order_traversal(root->leftChild);

post_order_traversal(root->rightChild);

printf("%d ", root->data);

}

}

int main(){

int i;

int array[7] = { 27, 14, 35, 10, 19, 31, 42 };

for(i = 0; i < 7; i++)

insert(array[i]);

printf("后序遍历:");

post_order_traversal(root);

return 0;

}

输出

后序遍历:10 19 14 31 42 35 27

class Node {

int data;

Node leftChild;

Node rightChild;

public Node(int key) {

data = key;

leftChild = rightChild = null;

}

}

public class TreeDataStructure {

Node root = null;

void post_order_traversal(Node node) {

if(node != null) {

post_order_traversal(node.leftChild);

post_order_traversal(node.rightChild);

System.out.print(node.data + " ");

}

}

public static void main(String args[]) {

TreeDataStructure tree = new TreeDataStructure();

tree.root = new Node(27);

tree.root.leftChild = new Node(12);

tree.root.rightChild = new Node(3);

tree.root.leftChild.leftChild = new Node(44);

tree.root.leftChild.rightChild = new Node(17);

tree.root.rightChild.leftChild = new Node(56);

System.out.println("后序遍历:");

tree.post_order_traversal(tree.root);

}

}

输出

后序遍历:

44 17 12 56 3 27

class Node:

def __init__(self, key):

self.leftChild = None

self.rightChild = None

self.data = key

# 创建一个函数来执行前序树遍历

def PostorderTraversal(root):

if root:

PostorderTraversal(root.leftChild)

PostorderTraversal(root.rightChild)

print(root.data)

# Main class

if __name__ == "__main__":

root = Node(3)

root.leftChild = Node(26)

root.rightChild = Node(42)

root.leftChild.leftChild = Node(54)

root.leftChild.rightChild = Node(65)

root.rightChild.leftChild = Node(12)

print("二叉树的后序遍历是")

PostorderTraversal(root)

输出

二叉树的后序遍历是

54

65

26

12

42

3

完整实现

现在让我们看看各种编程语言中树遍历的完整实现 −

C

C++

Java

Python

#include

#include

struct node {

int data;

struct node *leftChild;

struct node *rightChild;

};

struct node *root = NULL;

void insert(int data){

struct node *tempNode = (struct node*) malloc(sizeof(struct node));

struct node *current;

struct node *parent;

tempNode->data = data;

tempNode->leftChild = NULL;

tempNode->rightChild = NULL;

//如果树为空

if(root == NULL) {

root = tempNode;

} else {

current = root;

parent = NULL;

while(1) {

parent = current;

//去树的左边

if(data < parent->data) {

current = current->leftChild;

//插入到左侧

if(current == NULL) {

parent->leftChild = tempNode;

return;

}

}//去树的右边

else {

current = current->rightChild;

//插入到右侧

if(current == NULL) {

parent->rightChild = tempNode;

return;

}

}

}

}

}

void pre_order_traversal(struct node* root){

if(root != NULL) {

printf("%d ",root->data);

pre_order_traversal(root->leftChild);

pre_order_traversal(root->rightChild);

}

}

void inorder_traversal(struct node* root){

if(root != NULL) {

inorder_traversal(root->leftChild);

printf("%d ",root->data);

inorder_traversal(root->rightChild);

}

}

void post_order_traversal(struct node* root){

if(root != NULL) {

post_order_traversal(root->leftChild);

post_order_traversal(root->rightChild);

printf("%d ", root->data);

}

}

int main(){

int i;

int array[7] = { 27, 14, 35, 10, 19, 31, 42 };

for(i = 0; i < 7; i++)

insert(array[i]);

printf("前序遍历:");

pre_order_traversal(root);

printf("

中序遍历:");

inorder_traversal(root);

printf("

后序遍历:");

post_order_traversal(root);

return 0;

}

输出

前序遍历:27 14 10 19 35 31 42

中序遍历:10 14 19 27 31 35 42

后序遍历:10 19 14 31 42 35 27

#include

struct node {

int data;

struct node *leftChild;

struct node *rightChild;

};

struct node *root = NULL;

void insert(int data){

struct node *tempNode = (struct node*) malloc(sizeof(struct node));

struct node *current;

struct node *parent;

tempNode->data = data;

tempNode->leftChild = NULL;

tempNode->rightChild = NULL;

//如果树为空

if(root == NULL) {

root = tempNode;

} else {

current = root;

parent = NULL;

while(1) {

parent = current;

//去树的左边

if(data < parent->data) {

current = current->leftChild;

//插入到左侧

if(current == NULL) {

parent->leftChild = tempNode;

return;

}

}//去树的右边

else {

current = current->rightChild;

//插入到右侧

if(current == NULL) {

parent->rightChild = tempNode;

return;

}

}

}

}

}

void pre_order_traversal(struct node* root){

if(root != NULL) {

printf("%d ",root->data);

pre_order_traversal(root->leftChild);

pre_order_traversal(root->rightChild);

}

}

void inorder_traversal(struct node* root){

if(root != NULL) {

inorder_traversal(root->leftChild);

printf("%d ",root->data);

inorder_traversal(root->rightChild);

}

}

void post_order_traversal(struct node* root){

if(root != NULL) {

post_order_traversal(root->leftChild);

post_order_traversal(root->rightChild);

printf("%d ", root->data);

}

}

int main(){

int i;

int array[7] = { 27, 14, 35, 10, 19, 31, 42 };

for(i = 0; i < 7; i++)

insert(array[i]);

printf("前序遍历:");

pre_order_traversal(root);

printf("

中序遍历:");

inorder_traversal(root);

printf("

后序遍历:");

post_order_traversal(root);

return 0;

}

输出

前序遍历:27 14 10 19 35 31 42

中序遍历:10 14 19 27 31 35 42

后序遍历:10 19 14 31 42 35 27

class Node {

int data;

Node leftChild;

Node rightChild;

public Node(int key) {

data = key;

leftChild = rightChild = null;

}

}

public class TreeDataStructure {

Node root = null;

void inorder_traversal(Node node) {

if(node != null) {

inorder_traversal(node.leftChild);

System.out.print(node.data + " ");

inorder_traversal(node.rightChild);

}

}

void pre_order_traversal(Node node) {

if(node != null) {

System.out.print(node.data + " ");

pre_order_traversal(node.leftChild);

pre_order_traversal(node.rightChild);

}

}

void post_order_traversal(Node node) {

if(node != null) {

post_order_traversal(node.leftChild);

post_order_traversal(node.rightChild);

System.out.print(node.data + " ");

}

}

public static void main(String args[]) {

TreeDataStructure tree = new TreeDataStructure();

tree.root = new Node(27);

tree.root.leftChild = new Node(12);

tree.root.rightChild = new Node(3);

tree.root.leftChild.leftChild = new Node(44);

tree.root.leftChild.rightChild = new Node(17);

tree.root.rightChild.leftChild = new Node(56);

System.out.println("中序遍历:");

tree.inorder_traversal(tree.root);

System.out.println("

前序遍历:");

tree.pre_order_traversal(tree.root);

System.out.println("

后序遍历:");

tree.post_order_traversal(tree.root);

}

}

输出

中序遍历:

44 12 17 27 56 3

前序遍历:

27 12 44 17 3 56

后序遍历:

44 17 12 56 3 27

class Node:

def __init__(self, key):

self.leftChild = None

self.rightChild = None

self.data = key

# 创建一个函数来执行中序树遍历

def InorderTraversal(root):

if root:

InorderTraversal(root.leftChild)

print(root.data)

InorderTraversal(root.rightChild)

# 创建一个函数来执行前序树遍历

def PostorderTraversal(root):

if root:

PostorderTraversal(root.leftChild)

PostorderTraversal(root.rightChild)

print(root.data)

# 创建一个函数来执行后序树遍历

def PreorderTraversal(root):

if root:

print(root.data)

PreorderTraversal(root.leftChild)

PreorderTraversal(root.rightChild)

# Main class

if __name__ == "__main__":

root = Node(3)

root.leftChild = Node(26)

root.rightChild = Node(42)

root.leftChild.leftChild = Node(54)

root.leftChild.rightChild = Node(65)

root.rightChild.leftChild = Node(12)

# Function call

print("二叉树的中序遍历是")

InorderTraversal(root)

print("

二叉树的前序遍历是")

PreorderTraversal(root)

print("

二叉树的后序遍历是")

PostorderTraversal(root)

输出

二叉树的中序遍历是

54

26

65

3

12

42

二叉树的前序遍历是

3

26

54

65

42

12

二叉树的后序遍历是

54

65

26

12

42

3

相关推荐

迷你世界手游神圣树要多久才能长大
365bet体育线上

迷你世界手游神圣树要多久才能长大

🗓️ 07-06 👁️ 5887
好用的宾馆软件有哪些?几款订宾馆app推荐
365bet体育线上

好用的宾馆软件有哪些?几款订宾馆app推荐

🗓️ 08-27 👁️ 6876
2025年蜘蛛丝市场国内趋势报告:容量、价格走势及竞争调研
《英雄联盟》排位赛赛段点加分方法
bet3365

《英雄联盟》排位赛赛段点加分方法

🗓️ 07-31 👁️ 6691
长城冰雪借记卡
365bet哪个国家的

长城冰雪借记卡

🗓️ 02-06 👁️ 7692
浙江健康码申请
bet3365

浙江健康码申请

🗓️ 11-16 👁️ 3805