求二叉樹中最遠節點的距離,我們首先要對最遠距離有清晰的認識,最遠距離分為以下三類情況
因此我們在計算距離時總要與前一次的距離作比較,只有當此次左右距離之和大於max值才更改max的值,我們可以使用後續遍歷來計算最遠距離,此時時間複雜度為o(n),使用前序遍歷也是可以的,但時間複雜度為o(n*n),綜合比較我們選擇後續遍歷。實現方法寫在乙個搜尋樹中了。
**如下:
#pragma once
#include
#include
<
stack
>
#include
<
queue
>
using namespace std;
//尋找二叉樹中距離最遠的兩個節點
//使用遞迴,儲存上一次最遠距離,和這次節點的左右最長距離比較,取長的距離作為下次遞迴的長度
//使用後序遍歷和前序遍歷都可以結局此問題,但是前序遍歷時間複雜度為o(n*n),而後序遍歷的時間複雜度為o(n),因此選擇後續遍歷
template
struct bsnode
};template
class bstree
~bstree()
{}private:
int treedepth(node* root)
int rfindlongdistance(node* root,int &
max,int &leftlen,int &rightlen)
rfindlongdistance(root->left,max,leftlen,rightlen);
rfindlongdistance(root->right,max,leftlen,rightlen);
leftlen = treedepth(root->left);
rightlen = treedepth(root->right);
return
max> (leftlen + rightlen) ?
max : leftlen + rightlen;
}public:
size_t findlongerdistance()
int maxlen =
0; int leftlen =
0; int rightlen =
0; return rfindlongdistance(_root,maxlen,leftlen,rightlen) +
1; }
public:
void insert(t key)
else
else
if (key < cur->key)
else
}if (parent
->key > key)
else
newnode->
parent
=parent;}}
void print()
_print(_root);
}void _print(node* cur)
else
if (cur->left)
cout << cur->key <<
" ";
if (cur->right)
}node* find(int key)
else
if (cur->key < key)
else
}return
null;
}private:
bsnode* _root;
};
二叉樹如下:
結果如下:
二叉樹如下:
結果如下:
二叉樹如下:
結果如下:
求二叉樹中最遠的距離
分為兩種情況來討論 1 二叉樹中最遠的兩個節點經過根節點,如情況a 2 二叉樹中最遠的兩個節點不經過根節點,在其左子樹或者右子樹中 所以 二叉樹中最遠的距離 左子樹距離根節點最遠的節點 右子樹距離根節點最遠的節點 左子樹中最遠的距離,右子樹中最遠的距離 三者的最大值 include include ...
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...