【說明】
本文是左程雲老師所著的《程序員面試代碼指南》第三章中“分別用遞歸和非遞歸方式實現二叉樹先序、中序和後序遍歷”這一題目的C++復現。
本文只包含問題描述、C++代碼的實現以及簡單的思路,不包含解析說明,具體的問題解析請參考原書。
【題目】
用遞歸和非遞歸的方式,分別按照二叉樹先序、中序和後序打印所有的節點。我們約定:先序遍歷順序爲根、左、右;中序遍歷順序爲左、根、右;後序遍歷順序爲左、右、根。
- 頭文件:
binarytree.h - 源文件:
binarytree.cpp
源.cpp
binarytree.h
#pragma once
#ifndef _BINARYTREE
#define _BINARYTREE
#include <iostream>
using namespace std;
class Node
{
public :
Node(int data)
{
value = data;
left = NULL;
right = NULL;
}
public:
int value;
Node *left;
Node *right;
};
//遞歸版
void preOrderRecur(Node *head);
void inOrderRecur(Node *head);
void posOrderRecur(Node *head);
#endif // !_BINARYTREE
binarytree.cpp
#include <iostream>
#include "binarytree.h"
void preOrderRecur(Node *head)
{
if (head == NULL)
return;
cout << head->value << endl;
preOrderRecur(head->left);
preOrderRecur(head->right);
}
void inOrderRecur(Node *head)
{
if (head == NULL)
return;
inOrderRecur(head->left);
cout << head->value << endl;
inOrderRecur(head->right);
}
void posOrderRecur(Node *head)
{
if (head == NULL)
return;
posOrderRecur(head->left);
posOrderRecur(head->right);
cout << head->value << endl;
}
源.cpp
#include <iostream>
#include "binarytree.h"
using namespace std;
//數組方式建立二叉樹
void createBT(Node **head, int arr[], int len, int index = 0)
{
if (index > len - 1)
return;
(*head) = new Node(arr[index]);
createBT(&((*head)->left), arr, len, 2 * index + 1);
createBT(&((*head)->right), arr, len, 2 * index + 2);
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7};
Node *head = NULL;
createBT(&head, arr, 7);
cout << "Using recursive method to achieve pre-order traversal:" << endl;
preOrderRecur(head);
cout << endl;
cout << "Using recursive method to achieve in-order traversal:" << endl;
inOrderRecur(head);
cout << endl;
cout << "Using recursive method to achieve pos-order traversal:" << endl;
posOrderRecur(head);
cout << endl;
//cout << "hello 124" << endl;
system("pause");
return 0;
}