「二叉樹」作為特殊的樹,適合於計算機處理,所以二叉樹是研究的重點。我們通常將滿足下列的條件稱為二叉樹,每個節點的度都不大於2,每個節點的孩子節點次序不能任意顛倒。也就是說,乙個二叉樹中的每個節點只能含有0,1或2個孩子,而且每個孩子有左右孩子之分,位於左邊的孩子稱為左孩子,位於右邊的孩子稱為右孩子。說到二叉樹:就需要提到「滿二叉樹」和「完全二叉樹」。
滿二叉樹:在滿二叉樹中,每層節點都是滿的,即每層節點都具有最大節點數。
完全二叉樹:深度為k,節點數為n的二叉樹,即就是節點1-n的位置序號分別與滿二叉樹的節點1~n的位置序號一一對應。
二叉樹的儲存有兩種方式,順序儲存結構,鏈式儲存結構,這裡主要討論的是二叉樹的順序儲存方式,下面為簡單的圖示:
下面主要討論二叉樹的三種遍歷,前序(根-左-右)、中序(左-根-右)、後序(左-右-根)的遞迴和非遞迴的方式,還有針對二叉樹的一些操作:
—binarytree.h檔案
#pragma once
#include #include #include template struct binarytreenode //建立二叉樹節點
};template class binarytree
binarytree(const t* arr, size_t size, const t& invalid) //有參構造
binarytree(const binarytree& t) //拷貝構造
//node& operator=(const node& t) //賦值運算子過載
//// return *this;
//}node& operator=(node t)
~binarytree() //析構函式(後序)
public:
node* _createtree(const t* arr, size_t size, size_t& index, const t& invalid) //構造二叉樹
_root = root;
return _root;
}void prevorder() //前序遍歷二叉樹
void inorder() //中序遍歷二叉樹
void backorder() //後序遍歷二叉樹
void prevorder_nonr() //前序(非遞迴實現,利用棧) 根-左-右
if (tmp->_left != null)
}cout <
}void inorder_nonr() //中序遍歷(非遞迴)左-根-右
if (!s.empty()) //當s棧中不為空時,證明此時還沒有訪問到根節點
}cout <
}void backorder_nonr() //後序遍歷(非遞迴)左-右-根
node* tmp = s.top();
if (tmp->_right == null || tmp->_right == prev)
else
}cout <
}size_t size() //二叉樹的節點個數
size_t depth() //二叉樹的深度
size_t leafsize() //二叉樹葉子節點個數
void levelorder() //二叉樹的層次遍歷
queueq; //將節點插入佇列中
q.push(_root);
while (!q.empty())
if (q.front()->_right != null)
q.pop();}}
size_t getklevel(int k) //得到樹第k層的節點個數
protected:
void _prevorder(node* root) //前序
cout <_data>_prevorder(root->_left);
_prevorder(root->_right);
}void _inorder(node* root) //中序
_inorder(root->_left);
cout <_data>_inorder(root->_right);
}void _backorder(node* root) //後序
_backorder(root->_left);
_backorder(root->_right);
cout <_data>}
size_t _size(node* root) //節點個數
return _size(root->_left) + _size(root->_right) + 1;
}size_t _depth(node* root) //深度
int leftdepth = _depth(root->_left);
int rightdepth = _depth(root->_right);
return leftdepth > rightdepth ? leftdepth + 1 : rightdepth + 1;
}size_t _leafsize(node* root) //葉子節點個數
size_t size = 0;
if (root->_left == null && root->_right == null)
return _leafsize(root->_left) + _leafsize(root->_right);
}//size_t _leafsize(node* root) //葉子節點個數
//// if (root->_left == null && root->_right == null)
//
// _leafsize(root->_left);
// _leafsize(root->_right);
// return size;
//}size_t _getklevel(node* root, int k) //得到第k層樹的節點
if (k == 1)
return _getklevel(root->_left, (k - 1)) + _getklevel(root->_right, k - 1);
}node* _copy(node* root) //前序拷貝(遞迴)
node* newroot = new node(root->_data);
newroot->_left = _copy(root->_left);
newroot->_right = _copy(root->_right);
return newroot;
}void _destroy(node* root) //刪除所有節點(後序)
_destroy(root->_left);
_destroy(root->_right);
delete root;
}protected:
binarytreenode* _root;
};
資料結構 二叉樹 反轉二叉樹
include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...
《資料結構》 二叉樹
二叉樹 是 n個結點的有限集,它或為空集,或由乙個根結點及兩棵互不相交的 分別稱為該根的左子樹和右子樹的二叉樹組成。二叉樹不是樹的特殊情況,這是兩種不同的資料結構 它與無序樹和度為 2的有序樹不同。二叉樹的性質 1 二叉樹第 i層上的結點數最多為 2 i 1 2 深度為 k的二叉樹至多有 2 k 1...
資料結構 二叉樹
1.二叉樹 二叉樹是一種特殊結構的樹,每個節點中最多有兩個子節點,如圖1所示 圖1 二叉樹 在圖1中的二叉樹裡,a c有兩個子節點,b d有乙個子節點。對於二叉樹還有圖2中的以下情況 圖2 二叉樹的特殊情況 在博文中還介紹了滿二叉樹和完全二叉樹還有其他的特殊二叉樹。2.二叉樹的實現 有兩種實現方式,...