二叉樹的實現和遍歷

2021-06-19 18:11:18 字數 3932 閱讀 5590

雖然已經從事程式設計快4年了,但是由於不是科班出身,存在很多的弱點,尤其是最近的開發過程中,一旦遇到複雜點的對應關係就有氣無力的,有點時間就補一下基礎知識吧。

查詢二叉樹的實現和幾種遍歷方法  參考:資料結構與演算法分析c++描述

原始碼:二叉樹實現

#pragma once

#include #include using namespace std;

template class binarysearchtree

binarysearchtree(const binarysearchtree &rth)

:root(null) }

~binarysearchtree(void)

//查詢最小 遞迴

const comparable & findmin() const

return pnode->element;

} //查詢最小 非遞迴

const comparable & findmin2() const

return pnode->element;

} //查詢最大 遞迴

const comparable & findmax() const

return pnode->element;

} //查詢最大 非遞迴

const comparable & findmax2() const

return pnode->element;

} //查詢是否包含 遞迴

bool contains(const comparable &x) const

//查詢是否包含 非遞迴

bool contains2(const comparable &x) const

//判斷為空

bool isempty() const

else

}//遍歷 先序 遞迴

void printtreepreorder() const

else

}//遍歷 先序 非遞迴

void printtreepreorder2() const

//遍歷 中序 遞迴

void printtreeinorder() const

else

}void printtreeinorder2() const

else

} //遍歷 後序 遞迴

void printtreepostorder() const

else

}void printtreepostorder2() const

//清空

void makeempty()

//插入遞迴

void insert(const comparable &x)

//插入 非遞迴

void insert2(const comparable &x)

//刪除 遞迴

void remove(const comparable &x)

//樹高 遞迴

int height()const

const binarysearchtree & operator=(const binarysearchtree &rhs)

return *this;

}private:

struct binarynode

};void insert(const comparable &x, binarynode *&t) const //遞迴插入

else if(x < t->element)

else if(t->element < x)

else

}void insert2(const comparable &x, binarynode *&t) const //非遞迴 插入

else

else

}else if(pt->element < x)

else

}else

}} }

void remove(const comparable &x, binarynode *&t) const //遞迴remove

if( x < t->element)

else if(t->element < x)

else if(t->left != null && t->right != null)

else

}binarynode *findmin(binarynode *t) const //遞迴查詢最小值

if(t->left == null)

return findmin(t->left);

} binarynode *findmin2(binarynode *t) const //非遞迴查詢最小值

}return t;

} binarynode *findmax(binarynode *t) const //遞迴查詢最大值

if(t->right == null)

return findmax(t->right);

} binarynode *findmax2(binarynode *t) const //非遞迴查詢最大值

}return t;

} bool contains(const comparable &x, binarynode *t ) const //遞迴判斷是否存在

else if(x < t->element)

else if(t->element < x )

else

}bool contains2(const comparable &x, binarynode *t ) const //非遞迴 判斷是否存在

else if(t->element < x )

else

}return false;

} void makeempty(binarynode *&t)

t = null;

} binarynode *clone(binarynode *t) const //clone 晦澀

return new binarynode(t->element, clone(t->left), clone(t->right));

} int height(binarynode *t) const //樹高

else

}//遞迴遍歷 先序

void printtreepreorder(binarynode *t) const //遞迴遍歷 先序 }

//非遞迴遍歷 先序

void printtreepreorder2(binarynode *t) const

if(!stacknode.empty())

}} //遞迴 遍歷 中序

void printtreeinorder(binarynode *t) const //遞迴遍歷 中序 }

// 非遞迴遍歷 中序

void printtreeinorder2(binarynode *t) const

if(!stacknode.empty())

}} //遞迴 遍歷 後序

void printtreepostorder(binarynode *t) const //遞迴遍歷 後序 }

//非遞迴 遍歷 後序

void printtreepostorder2(binarynode *t) const

while(!s.empty())

else

if(cur->left != null)

}} }

private:

binarynode *root;

};

測試:

#include #include #include "binarysearchtree.h"

using namespace std;

int main()

結果

二叉樹的實現和遍歷

性質1 在二叉樹的第i層上至多有2 i 1 個結點 性質2 深度為k的二叉樹至多有2 k 1個結點 性質3 對任何一棵二叉樹,如果其終端節點數為n0,度為2的結點數為n2,則n0 n2 1 性質4 具有n個節點的完全二叉樹的深度為 logn 1 這裡 表示向下取整。性質5 對一棵有n個節點的完全二叉...

二叉樹的實現和遍歷

性質1 在二叉樹的第i層上至多有2 i 1 個結點 性質2 深度為k的二叉樹至多有2 k 1個結點 性質3 對任何一棵二叉樹,如果其終端節點數為n0,度為2的結點數為n2,則n0 n2 1 性質4 具有n個節點的完全二叉樹的深度為 logn 1 這裡 表示向下取整。性質5 對一棵有n個節點的完全二叉...

二叉樹的遍歷和線索二叉樹

二叉樹的遍歷,所謂二叉樹的遍歷,是指按某條搜尋路徑訪問樹中的每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。由二叉樹的遞迴定義可知,遍歷一棵二叉樹便要決定對根結點n,左子樹l和右子樹r的訪問順序。按照先遍歷再遍歷右子樹的原則,常見的遍歷次序有先,中,後三種遍歷方法,其中序指的是根結點再何時被訪...