使用C++構建一個二叉樹并復制、輸出。
程序
#include
#include
//#include
#include
#include
#include
#include
#include
using namespace std;
struct TreeNode // 定義二叉樹
{
int val; // 當前節點值用val表示
struct TreeNode *left; // 指向左子樹的指針用left表示
struct TreeNode *right; // 指向右子樹的指針用right表示
TreeNode(int x) :val(x), left(NULL), right(NULL) { } // 初始化當前結點值為x,左右子樹為空
};
//創建樹
TreeNode* insert(TreeNode* tree, int value)
{
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); // 創建一個節點
node->val = value; // 初始化節點 // malloc函數可以分配長度
node->left = NULL;
node->right = NULL;
TreeNode* temp = tree; // 從樹根開始
while (temp != NULL)
{
if (value < temp->val) // 小于根節點就進左子樹
{
if (temp->left == NULL)
{
temp->left = node; // 新插入的數為temp的左子樹
return tree;
}
else // 下一輪判斷
temp = temp->left;
}
else // 否則進右子樹
{
if (temp->right == NULL)
{
temp->right = node; // 新插入的數為temp的右子樹
return tree;
}
else // 下一輪判斷
temp = temp->right;
}
}
return tree;
}
// ************* 輸出圖形二叉樹 *************
void output_impl(TreeNode* n, bool left, string const& indent)
{
if (n->right)
{
output_impl(n->right, false, indent + (left ? "| " : " "));
}
cout << indent;
cout << (left ? '\\' : '/');
cout << "-----";
cout << n->val << endl;
if (n->left)
{
output_impl(n->left, true, indent + (left ? " " : "| "));
}
}
void output(TreeNode* root)
{
if (root->right)
{
output_impl(root->right, false, "");
}
cout << root->val << endl;
if (root->left)
{
output_impl(root->left, true, "");
}
system("pause");
}
// ******************************************
void CopyBiTree(TreeNode* root, TreeNode* newroot) // 復制二叉樹
{
if (root == nullptr)
return;
else
{
newroot->val = root->val;
if (root->left != nullptr)
newroot->left = new TreeNode(0);
if (root->right != nullptr)
newroot->right = new TreeNode(0);
CopyBiTree(root->left, newroot->left);
CopyBiTree(root->right, newroot->right);
}
//output(newroot);
}
// ====================測試代碼====================
int main()
{
TreeNode* tree =new TreeNode(10); // 樹的根節點
TreeNode* treeresult;
treeresult = insert(tree, 6); // 輸入n個數并創建這個樹
treeresult = insert(tree, 4);
treeresult = insert(tree, 8);
treeresult = insert(tree, 14);
treeresult = insert(tree, 12);
treeresult = insert(tree, 16);
TreeNode* mirroot = new TreeNode(10);
CopyBiTree(treeresult, mirroot); // 復制二叉樹
output(treeresult); // 輸出原二叉樹
output(mirroot); // 輸出復制的二叉樹
}
結果
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
程序
+關注
關注
117文章
3795瀏覽量
81411 -
C++
+關注
關注
22文章
2114瀏覽量
73857 -
二叉樹
+關注
關注
0文章
74瀏覽量
12375
發布評論請先 登錄
相關推薦
二叉樹算法在單總線技術中的應用
介紹了單總線技術和二叉樹算法。單總線技術可以將地址線、數據線和控制線合成一根線,并允許在這根線上掛接多個單總線器件。提出了用二叉樹算法搜索單總線器件注冊碼,并
發表于 03-16 09:38
?20次下載
基于二叉樹的時序電路測試序列設計
為了實現時序電路狀態驗證和故障檢測,需要事先設計一個輸入測試序列。基于二叉樹節點和樹枝的特性,建立時序電路狀態二叉樹,按照電路二叉樹節點(狀態)與樹枝(輸入)的層次邏輯
發表于 07-12 13:57
?0次下載
![基于<b class='flag-5'>二叉樹</b>的時序電路測試序列設計](https://file.elecfans.com/web2/M00/49/61/pYYBAGKhtEqAYbJ1AAAUAGheIIE265.jpg)
二叉樹層次遍歷算法的驗證
實現二叉樹的層次遍歷算法,并對用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”創建的二叉樹進行測試。
發表于 11-28 01:05
?2119次閱讀
![<b class='flag-5'>二叉樹</b>層次遍歷算法的驗證](https://file1.elecfans.com//web2/M00/A6/F8/wKgZomUMQYuACG4BAAD6E6w3nWA722.png)
二叉樹操作的相關知識和代碼詳解
樹是數據結構中的重中之重,尤其以各類二叉樹為學習的難點。在面試環節中,二叉樹也是必考的模塊。本文主要講二叉樹操作的相關知識,梳理面試常考的內容。請大家跟隨小編一起來復習吧。 本篇針對面
![<b class='flag-5'>二叉樹</b>操作的相關知識和代碼詳解](https://file.elecfans.com/web1/M00/D3/8A/o4YBAF_UNdWAKbdOAABCZo07G7k600.png)
二叉樹的前序遍歷非遞歸實現
我們之前說了二叉樹基礎及二叉的幾種遍歷方式及練習題,今天我們來看一下二叉樹的前序遍歷非遞歸實現。 前序遍歷的順序是, 對于樹中的某節點,先遍歷該節點,然后再遍歷其左子樹,最后遍歷其右子
C++基礎語法中的二叉樹詳解
本期是C++基礎語法分享的第十四節,今天給大家來梳理一下樹! ? 二叉樹 BinaryTree.cpp: #include 《stdio.h》#include 《stdlib.h》 #define
C語言數據結構:什么是二叉樹?
完全二叉樹:完全二叉樹是效率很高的數據結構。對于深度為K,有n個節點的二叉樹,當且僅當每一個節點都與深度為K的滿二叉樹中編號從1至n的節點一一對應時,稱為完全
怎么就能構造成二叉樹呢?
一直跟著公眾號學算法的錄友 應該知道,我在二叉樹:構造二叉樹登場!,已經講過,只有 中序與后序 和 中序和前序 可以確定一顆唯一的二叉樹。前序和后序是不能確定唯一的二叉樹的。
評論