递归构造二叉树和二叉树的遍历
生活随笔
收集整理的這篇文章主要介紹了
递归构造二叉树和二叉树的遍历
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
學習遞歸構造二叉樹,并且進行前序遍歷。
前序遍歷,中序遍歷和后序遍歷是什么?
遍歷的順序分別如下:
- 前序遍歷:根節點,左子樹,右子樹;
- 中序遍歷:左子樹,根節點,右子樹;
- 后序遍歷:左子樹,右子樹,根節點。
明眼人可能看出來了:這里的前中后指的是根節點的位置。
前序遍歷是根節點在前,中序遍歷指根節點在中間遍歷,中序遍歷又叫做“投影遍歷”,順序基本上沒變。
遞歸生成樹的代碼:
//定義 結點結構體 struct tnode {T data;tnode<T>* left;tnode<T>* right;tnode<T>* parent; };//遞歸生成樹的函數 //返回指向根節點的指針 double alpha;//根節點的比例 template <typename iterator>//迭代器類型 iterator tree_generation(iterator start, size_t n) {if (n < 1)return NULL;size_t c = (n - 1)*alpha;//根相對位置iterator root = start + c;//根節點的位置iterator left_subtree = tree_generation(start, c);//左子樹的樹根iterator right_subtree = tree_generation(start + c + 1, n - 1 - c);//右子樹的樹根root->left = left_subtree;//根節點的左兒子root->right = right_subtree;//根節點的右兒子if (left_subtree != NULL)//左子樹的父親left_subtree->parent = root;if (right_subtree != NULL)//右子樹的父親right_subtree->parent = root;return root; }遞歸前序遍歷的代碼:
//前序遍歷 template<typename iterator>void pre_order(iterator p) {if (p != NULL){cout << p->data << ' ';//根節點,這里做打印處理pre_order(p->left);//遍歷左子樹pre_order(p->right);//遍歷右子樹} }中序遍歷的代碼:
//中序遍歷 template<typename iterator>void in_order(iterator p) {if (p != NULL){in_order(p->left);//左子樹cout << p->data << ' ';//根節點in_order(p->right);//右子樹} }后序遍歷的代碼:
//后序遍歷 template<typename iterator>void back_order(iterator p) {if (p != NULL){back_order(p->left);//左子樹back_order(p->right);//右子樹cout << p->data << ' ';//根節點} }全部代碼:
// binary_tree.cpp : 此文件包含 "main" 函數。程序執行將在此處開始并結束。 //#include "pch.h" #include <iostream> #include<vector>using namespace std; //template<typename iterator> template<typename T> //樹的結點 struct tnode {T data;tnode<T>* left;tnode<T>* right;tnode<T>* parent; };//遞歸生成樹 double alpha; template <typename iterator> iterator tree_generation(iterator start, size_t n) {if (n < 1)return NULL;size_t c = (n - 1)*alpha;//根相對位置iterator root = start + c;//根節點的位置iterator left_subtree = tree_generation(start, c);//左子樹的樹根iterator right_subtree = tree_generation(start + c + 1, n - 1 - c);//右子樹的樹根root->left = left_subtree;root->right = right_subtree;if (left_subtree != NULL)left_subtree->parent = root;if (right_subtree != NULL)right_subtree->parent = root;return root; }//前序遍歷 template<typename iterator>void pre_order(iterator p) {if (p != NULL){cout << p->data << ' ';pre_order(p->left);pre_order(p->right);} }//中序遍歷 template<typename iterator>void in_order(iterator p) {if (p != NULL){in_order(p->left);//左子樹cout << p->data << ' ';//根節點in_order(p->right);//右子樹} }//后序遍歷 template<typename iterator>void back_order(iterator p) {if (p != NULL){back_order(p->left);//左子樹back_order(p->right);//右子樹cout << p->data << ' ';//根節點} }int main() {std::cout << "Hello World!\n"; size_t n;cout << "請輸入元素個數:" << endl;cin >> n;if (n < 1)return 0;vector<tnode<size_t>> tree(n);for (size_t i = 0; i < tree.size(); ++i)tree[i].data = i;//賦值alpha = 0.3;//比例auto root = tree_generation(&tree[0], tree.size());//生成樹root->parent = NULL;//樹根的處理cout << "樹中的元素有:" << endl;for (const auto &x : tree)cout << x.data << ' ';cout << endl << endl;cout << "前序遍歷的結果為:" << endl;pre_order(root);//前序遍歷打印cout << endl << endl;cout << "中序遍歷的結果為:" << endl;in_order(root);//中序遍歷打印cout << endl << endl;cout << "后序遍歷的結果為:" << endl;back_order(root);//后序遍歷打印}樹的遍歷結果:
可以看到:中序遍歷是投影遍歷,向下做一個投影。
本文簡單記錄了樹的遞歸生成形式,以及主函數如何調用。
其次,本文記錄了樹遞歸形式的:前序遍歷,中序遍歷和后序遍歷。
希望對你有幫助。
總結
以上是生活随笔為你收集整理的递归构造二叉树和二叉树的遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浦发信用卡分期手续费是多少
- 下一篇: Leetcode255用队列构造栈